HeadFirst设计模式这个书买回来,就看了两三成,而且一忙起来就是忘得干干净净,每次都要回头慢慢复习,不但效率很低,而且人的积极性也不高,所以现在开始,从第一个设计模式开始,每学习一个部分,都要记录和总结,并且把自己的体会记录下来,也是对自己编程水平的一个提高,第一个设计模式策略模式
1.1 定义:
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
1.2 总结在前:
策略模式中用到的设计原则:
- 找出应用程序可能变化的地方,把他们独立出来,不要和那些不需要变化的代码混在一起。
- 针对接口编程,而不是实现;多用组合,少用继承。
一些要点 :
- 知道OO基础(封装继承多态)并不足以让你设计出良好的OO系统。
- 良好的OO系统必须具备可复用,可扩充,可维护三个特性。
2.1 从鸭子模拟器开始策略模式
需求:
- 有不同种类的鸭子,绿毛鸭,会飞鸭,橡皮鸭子,火箭鸭子等等
- 鸭子具有不同的行为,比如有的鸭子会飞,有的不会,有的会叫有的不会叫
- 同一行为的具体表现也不一样,比如有的鸭子呱呱叫,有的鸭子咕咕叫(实现不一样)
- 有时候我们需要动态的改变鸭子的行为,比如橡皮鸭不会飞,在运行过程中,橡皮鸭得到了火箭,获得了飞行的能力,即火箭飞。
2.2 思路阐述
根据上面的需求,逐条阐述思路:
- 鸭子为基类或者基接口,其他的具体的鸭子都是子类。
- 行为即能力,OO中就是接口。鸭子类中,用字段和属性来保存接口。
- 接口有不同的子类来实现多态。
- 鸭子类中,字段和属性保存的接口实现可以修改,即可以set。
2.3 代码实现
首先定义接口和接口实现
public interface IflyBehavior
{
void fly();
}
public interface IQuackBehavior
{
void quack();
}
//接口实现
public class FlyWithWings : IflyBehavior
{
public void fly()
{
Console.WriteLine("fly with wings");
}
}
public class FlyNoWay : IflyBehavior
{
public void fly()
{
Console.WriteLine(" can not fly");
}
}
public class Quack : IQuackBehavior
{
public void quack()
{
Console.WriteLine("gua gua gua ");
}
}
然后就是鸭子基类的设计:
因为有些方法必须子类重写display(),所以为抽象类,必须重写的方法为抽象方法
public abstract class Duck
{
public Duck()
{
//基类构造函数
}
public IflyBehavior fly;
public IQuackBehavior quack;
public abstract void display();
//具体实现委托给行为类
public void performFly()
{
fly.fly();
}
public void performQuack()
{
quack.quack();
}
//实现动态设定行为
public void SetFlyBehavior(IflyBehavior ifly)
{
fly = ifly;
}
public void SetQuackBehavior(IQuackBehavior iquack)
{
quack = iquack;
}
//基类中的公用方法
public void swim()
{
Console.WriteLine("all ducks float");
}
}
具体的某一种鸭子的实现:
public class SuperDuck : Duck
{
public SuperDuck()
{
this.fly = new FlyWithWings();
this.quack = new Quack();
}
public override void display()
{
Console.WriteLine("this is super duck");
}
}
控制台测试:
static void Main(string[] args)
{
Duck d = new SuperDuck();
d.performFly();
d.performQuack();
d.SetFlyBehavior(new FlyNoWay());
d.performFly();
Console.ReadKey();
}
输出结果为:
fly with wings
gua gua gua
can not fly