【设计模式】之策略模式

来源:互联网 发布:互联网金融 创业 知乎 编辑:程序博客网 时间:2024/05/21 00:00

一、什么是策略模式

策略模式的目的是定义一系列算法,把它们封装起来,并且使它们可以相互替换。

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 策略模式的好处在于你可以动态的改变对象的行为。

二、设计模式的设计原则

  设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。 
策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

三、设计模式的组成

策略模式中有三个对象:
(1环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2抽象策略对象:它可由接口或抽象类来实现。
(3具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

四、设计模式的实例

(1)类之间的关系

(2)代码实现

步骤一:创建接口

package study_02.designpattern.strategy;public interface Strategy {   public int doOperation(int num1, int num2);}

步骤二:创建具体的接口实现抽象策略对象

package study_02.designpattern.strategy;public class OperationAdd implements Strategy{@Override    public int doOperation(int num1, int num2) {       return num1 + num2;    }}

步骤三:创建具体的接口实现抽象策略对象

package study_02.designpattern.strategy;public class OperationSubstract implements Strategy{    @Override    public int doOperation(int num1, int num2) {       return num1 - num2;    }}

步骤四:创建具体的接口实现抽象策略对象

package study_02.designpattern.strategy;public class OperationMultiply implements Strategy{  @Override  public int doOperation(int num1, int num2) {     return num1 * num2;  }}

步骤五:创建环境对象

package study_02.designpattern.strategy;public class Context {    private Strategy strategy;        public Context(Strategy strategy){      this.strategy = strategy;    }        public int executeStrategy(int num1, int num2){      return strategy.doOperation(num1, num2);    }}

步骤五:应用实例

package study_02.designpattern.strategy;public class StrategyPatternDemo {   public static void main(String[] args) {      Context context = new Context(new OperationAdd());      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));      context = new Context(new OperationSubstract());      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));      context = new Context(new OperationMultiply());      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));   }}

步骤六:输出结果

10 + 5 = 15

10 - 5 = 5

10 * 5 = 50

五、策略模式的缺点:

(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

(2)策略模式造成许多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

六、参考资料

   http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm

 

 

 

 

 

 

原创粉丝点击