策略(strategy)模式

目的:算法

把算法封装起来,而且使他们能够相互替换,使得算法能够独立于使用它的客户而变化。函数

适用情景:指针

一、  许多的类仅仅是行为有异(数据一致),”策略”提供了一种用多个行为中的一个行为来配置一个类的方法。对象

二、  须要使用不一样的算法,如能够根据不一样参数选取不一样的效率算法。接口

三、  算法使用客户不该该知道的数据。it

四、  替换多个if/else或switch语句编译

UML描述:效率


协做:扩展

         Strategy和Context相互做用以实现选定的算法。当算法被调用时,Context能够将该算法所需的数据传递给该Strategy。或者Context将自身做为一个参数传递给Strategy。配置

         Context将它的客户的请求转发给它的Strategy。客户一般建立并传递一个ConcreteStrategy对象给Context;这样,客户能够选取不一样的ConcreteStrategy与Context交互。客户选取Strategy时须要了解这些Strategy到底有何不一样,此时可能不得不向客户暴露具体的实现问题。

数据接口的实现问题:

1)      定义Strategy和Context接口

一种办法是将Context将参数逐个传给Strategy的操做方法;另外一种是让Context将自身做为一个参数传给Strategy的操做方法(可能有的数据是没必要要的,可是接口简洁)

2)      将Strategy做为模版参数

         使用这种方法不须要给Strategy定义接口的抽象类,把Strategy做为一个模版参数也使得能够将一个Strategy和它的Context静态绑定在一块儿,从而提升效率。

适用条件:1) 能够在编译时选择strategy   2)strategy不须要在运行时改变

3)      使Strategy对象成为可选的

         这种情形经过定义Strategy对象的缺省行为来实现,当Context访问Strategy时需先判断Strategy是否存在,若是客户使用缺省的行为就不须要处理Strategy对象。

扩展:

Strategy也能够被封装成单例形式,在Context中经过指针方式与Strategy交换(c语言的话也能够用函数指针实现)

相关文章
相关标签/搜索