读书人

设计形式深入浅出-策略模式(Strategy

发布时间: 2012-08-22 09:50:35 作者: rapoo

设计模式深入浅出-----策略模式(Strategy Pattern)

使用模式最好的方式是把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用他们。

策略模式(StrategyPattern):

定义算法族,分别封装起来,让他们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。

1、先从简单的模拟鸭子应用做起:

(1)设计一个鸭子超类,让各种鸭子继承这个超类。

设计形式深入浅出-策略模式(Strategy Pattern)


这个是用继承来实现的,看上去没有什么不妥。

(2)现在需要为鸭子增加飞(fly)的功能,而且还会新增鸭子。

设计形式深入浅出-策略模式(Strategy Pattern)

只需在父类中加上fiy()方法。橡皮鸭子不会叫,也不会飞,这时只需要覆盖掉里面的方法,让其什么也不做。看上去是很好的设计。

(3)现在设计有变,需要新增100只鸭子,其中很多鸭子不会游泳,也不会飞。

问题:如果用继承,那么你需要自己动手一个个来覆盖,这样的设计还是好的设计吗?

(4)尝试改变设计:将 fly( ) 方法从超类中取出来,放进Flyable接口中去,这样只有会飞的鸭子才实现Flyable接口。

看起来好像是不错的设计,但是并没有做到代码的复用。当有100个鸭子会飞时,那么就必须得实现100次接口了。这只是从一个噩梦跳向另一个噩梦。


2、策略模式引路:

软件开发不变的真理--------CHANGE

不管当初软件设计的多好,一段时间之后,总是需要成长和改变的,否则软件就会死亡。驱动改变的因素很多。

设计原则:找出应用中可能变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

设计形式深入浅出-策略模式(Strategy Pattern)

我们想要的是行为具有弹性。于是可以让鸭子的行为在运行时动态的改变。

设计原则:针对接口编程,而不是实现编程。

设计形式深入浅出-策略模式(Strategy Pattern)

现在鸭子的 fiy 与 quack 行为被封装起来了。

现在来写一些代码。

测试代码Duck.java:


以上看到的就是策略模式了。

定义算法族,分别封装起来,让他们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。


设计形式深入浅出-策略模式(Strategy Pattern)

策略模式的一般画法。


设计形式深入浅出-策略模式(Strategy Pattern)

HeadFirst系列经典例子呀。

转载请注明出处 http://blog.csdn.net/xn4545945

个人微博:http://weibo.com/xuneng007



读书人网 >软件开发

热点推荐