【设计模式】学习笔记1:策略模式(Strategy)

本文出自 http://blog.csdn.net/shuangde800

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

实例

让我们来设计鸭子类,在生活中,会有各种各样的鸭子,有会飞的和不会飞的,他们各种叫声也各不相同。
在这里,就假设鸭子有两种行为:飞行, 叫声。
 
如果不用策略模式来设计的话,那么可能就是用继承,即设计一个抽象类Duck,然后根据各种鸭子的特点继承实现这个类,再覆盖鸭子行为。
 
如下图:
【设计模式】学习笔记1:策略模式(Strategy)
 
 
如果这样做的话,就是针对具体类的实现来编程
所有的子类,例如北京烤鸭,玩具鸭,绿头鸭都将会继承父类的行为,但是并不是所有的子类行为都和父类的行为一样的,北京烤鸭是不可能会飞的,也不可能会叫(应为它已经被烤熟了),玩具鸭可以叫,也有可能会飞……
所以,在继承时你必须要覆盖父类的方法,如果需要改变行为,那么就就要更改源代码。
 
 
良好的OO设计必须具备可复用性、可扩充性、可维护三个特性。 这个设计都不符合。
 
 
 

设计原则

设计原则1:
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
 
设计原则2:
针对接口编程,而不是针对实现编程
 
设计原则3:
多用组合,少用继承
 
根据这三个设计原则,可以用策略模式来重新设计。
 
【设计模式】学习笔记1:策略模式(Strategy)
 
这样的话,就把变化的部分完全分离出来了,当行为变化时,我们也只需要针对接口FlyBehavior和QuackBevior编程即可,而不用改变源代码。
 
 

策略模式定义

定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
 
 
它的UML图基本是下面这样的:
 
【设计模式】学习笔记1:策略模式(Strategy)
 
 

策略模式的优缺点

(来自百科)
 
优点:
1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
3、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
 
 
 
 
 
 
 
 
 
 
 
 
 

相关推荐