这两天抽空开始看设计模式的书,用的是Head first 设计模式。感觉这本书写的还是很好的,讲解非常生动,看起来也很有趣,没有枯燥感。
现在已经看完了两个模式:策略模式(strategy pattern)和观察者模式(observer pattern),想一下以前写的代码,简直就是垃圾马。好好学习设计模式,这里做好笔记。
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
书中用到的例子是一个鸭子行为的设计。鸭子的飞行和叫声是不同的,这时就设计到如何设计它的这两个行为的问题。第一种思路是使用继承,具体实现其子类的时候覆盖掉父类的方法,这时提出了诱饵鸭子不会飞也不会叫,而橡皮鸭子不会飞但是会叫,而每当有新的类型出现时就要适当的处理这些方法,可能会不易于维护。继承带来的缺点:代码在多个子类中重复,运行时的行为不容易改变,很难知道鸭子的全部行为,改变的话会引起所有鸭子的改变。
另一种思路是把飞行和叫设计成接口,而把鸭子的具体行为实现接口来实现,但是这样引起的行为就是太过于多的重复代码,当有很多鸭子的子类的时候需要改变的内容太多。
设计原则:找出应用中可能变化的地方,把他们独立出来,不要把他们和那些不需要变化的代码混在一起。鸭子的飞行和叫声就是这样的。
设计原则2:针对接口编程,而不是针对实现编程。(还没理解透彻)
例子:Animal抽象类,Cat类,Dog类。
Cat cat=new Cat();
cat.miao();//针对实现编程
Animal dog=new Dog();
dog.makesound();//针对接口编程
这里的意思就是用接口来进行编程,这样就不会依赖于程序的具体实现,起到多态的作用。
例如本例的鸭子飞行的设计,可以把飞行设计为一个接口,把飞行的具体方式设计为类,这样的话,就可以使用接口来描述飞行,而它的具体实现就可以随着变化而变化。
具体的实现如下:
接口:FlyBehavior<--FlyBehavior类
<-------FlyNoWay类
接口QuakBehavior<-------Quake类
<--------Squake类
<---MuteQuake类
在设计父类Duck类的时候新添加两个变量:
private FlyBehavior;
private Quakbehavior;
这样具体的实现的时候就可以使用具体实现这两个接口的类来进行具体实现的变化。
类MallardDuck extends Duck
{
MallardDuck ()
{
FlyBehavior=具体的类;
Quakbehavior=具体的类;
}
}
当然如果需要改变的话也可以加上set和get方法
设计原则3:多用组合,少用继承。
重新理解定义:
定义算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
这次笔记到这里结束,下次总结Observer(观察者模式)。