首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式学习笔记——策略模式

2012-11-10 
设计模式学习笔记——策略模式?策略模式属于对象的行为模式,是针对一组算法,将每一个算法封装到具有共同接口

设计模式学习笔记——策略模式

?

策略模式

属于对象的行为模式,是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得他们之间可互相替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。

?

策略模式是对算法的包装,把使用算法的责任和算法本身分离,委派给不同对象管理。

?

策略模式涉及到的角色

环境角色Context:持有Strategy类的引用

抽象策略角色Strategy:抽象角色,由接口或抽象类实现,给出统一算法接口

具体策略角色ConcreteStrategy:具体的算法实现

?

搬运过来的类图一枚


设计方式学习笔记——策略模式

从代码上来看策略模式相当简单,甚至可以免去解释,下面是各个类的实现

首先是抽象接口Strategy

?

public class StrategyPattern {public static void main(String[] args) {Context context1=new Context(new ConcreteStrategy());Context context2=new Context(new ConcreteStrategy2());context1.contextInterface();context2.contextInterface();}}
?

输出结果

?

first strategy

second strategy

?

上面的策略模式应该说是最最简单的,在书中还提到了策略模式在实现过程中需要注意的地方

1 具体策略角色有公共的行为或者属性 这个情况还是比较多的 此时应该将上面的Strategy从接口改为抽象类

2 策略模式在同一时间只能使用一个策略对象,但一个应用程序可能需要与多个策略相关联。也就是说,应用程序启动的时候,策略对象应该已经被创立,从而实现切换。

?

策略模式的使用时机

1 系统中有许多类,而他们之间的区别只是行为

2 系统需要动态选择几种算法,则将算法包装起来

3 系统算法使用的数据不能让客户端知道

4 一个对象有多种行为,只能使用多重if...else语句实现

?

策略模式的优缺点

优点

1 提供了管理相关算法族的方法。适当使用继承可以把公共代码转移到父类,避免重复代码

2 策略模式提供了替换继承关系的办法。

3 避免了多重条件判断

缺点

1 客户端必须知道所有的策略类,并自行决定使用哪个。

2 造成会有很多策略类(可由享元模式减少对象数量)

?

以上是策略模式的简单描述 很多也是书上的摘录 在网上同样有不少策略模式的文章 下面是具体的2篇

http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html

http://www.uml.org.cn/sjms/201009092.asp

两者都有一个非常循序渐进的讲解过程,给了具体的场景,并提供了如何提供优化,为何使用策略模式的讲解,是非常好的,非常推荐

前一篇的鸭子问题,是将鸭子的fly行为抽象成接口,并分别给不同的鸭子提供了具体的fly方法实现,并由鸭子去选择使用哪一种方式。

后一篇则是典型的策略模式场景,折扣问题。同样的,将折扣类的不同方式作为具体策略的实现,而由客户来决定应该使用哪一种折扣方式。

而从上面不同鸭子(不同客户)的角度看,也体现了策略模式的一个缺点,就是客户端必须知道可用的策略类。

?

除了以上2个写得非常深入浅出的例子,在Java中也有该例子,是什么呢,书上给的是java.awt中的例子,LayoutManager的例子,但是对于对awt没有什么接触的人,在理解上可能会比较困难,其实在Java或者C#中,有一个经常用到的东西,也是应用了策略模式,他就是排序问题

正好前两天和韩神讨论了这个问题,java对于值类型的List实现了sort方法,这是大家都知道的,但是对于List<T>的泛型中,我们经常会放置非值类型的元素,更多的时候,是对象集合,那么此时sort方法便不可用了。

观察仔细的话,会发现Collections中有一个静态方法sort(Collections<T> cols, Comparator comp),这个方法也是我们需要关注的了

Comparator是一个接口,而这个接口恰恰是对应了策略模式中的抽象策略类Strategy,那么对应策略模式去看,排序问题就非常好理解了,我们需要实现自己的排序算法,就应当是去实现一个自己的MyComparator(对应具体策略ConcreteStrategy)。而这里Collections呢,自然是扮演了Context的角色。

?

这里再提一句额外的,关于Comparator和Comparable之间的区别,上面已经说了Comparator是代表一个具体的策略算法。而Comparable是指能力,可以理解为,实现了Comparable的对象,是可以被比较的,即赋予类比较的能力(实现其中的Compare方法),而实现Comparator,则只是一个具体的比较算法。


热点排行