所谓策略模式,就是说实现一件事情有多种算法。而客户端需要对这些算法进行选择。
常规做法有2种:
1.你可以把这些实现的算法,写到一个类里面,然后对外提供接口,调用你所需要的。可是。。。?
这有个明显的缺点就是,将来,你多了一种更好的算法,那么你必然要改变原来的这个类,需修改封装好的,不符合开闭原则。
2.用if...else判断来进行选择具体哪个算法,可是。。。?
这也有上面的问题,多了一种算法,你需要修改以前哪个算法的逻辑,增加if判断,不好维护,工作量大。
那怎么办???
策略模式,把你的算法封装成独立的子类,他们之间没任何关系,具体的选择由客户端决定。
所以当你有新算法的时候,继续另外写个新的子类,不需要改动别人以前写好的东西。
所以,在策略模式中,最大的特点就是,客户必须明确的知道,做一件事情,到底有哪些“策略”。举例说明:
1.要过年了,回家,是必须的。那么你怎么回家呢?
a.坐火车。。。
b.坐灰机。。。
c.步行回家。。。(你妹,你才步行回家)
这就是回家的一种策略选择,其实在这些策略里面,还有一种就是,坐汽车回家(因为刚开通到你家直达汽车,你却不知道有这回事)
所以,上面想说,同样的回家,其实有4种方式,而由于客户必须明确的知道,你要进行那种策略的选择,否则,你就会错过汽车回家这种策略。
2.就是算法里面的排序,因为排序有一大堆,冒泡,选择,交换等等,
当你用sort实现排序的时候,根据不同的实际情况,你需要制定不同的排序方法,假如你连冒泡的这种排序都不清楚,怎么做选择?
所以,明显的看出,策略模式对客户端进行了要求,必须很清楚的有哪些策略进行选择。
类似的可以抽象成下面的这种情况。
环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。
具体的代码看向这里:http://blog.csdn.net/chmask/article/details/2631485