【Java设计模式】· 策略模式(Strategy Pattern)

来源:互联网 发布:安阳淘宝电商摄影 编辑:程序博客网 时间:2024/04/30 22:08

策略模式:


            1.策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。需要的时候可以灵活地调用方法,也可以对方法(策略)进行修改,客户端调用方法时不需要知道这个方法是怎样实现的。


        2.策略模式区别于访问者模式,解释器模式,状态模式。

               访问者模式里面两个对象(访问者与被访者)之间有相互调用函数,增加一个访问者会比较困难(要连同被访者的几个重载函数一起创建,在被访者类里面也要增加相应的函数),在策略模式里面只要增加一个策略类(并implements Strategy)就可以了。


               解释器模式里面,如四则运算,加法只是解决问题所用到的一条语句,解释器模式根据问题将算法和参与运算的值组合成一个树型结构,非叶子节点(NonterminalExpression)为算法,叶子节点(TerminalExpression)为参与运算的值,最后通过遍历这颗树求得问题的解


               状态模式和策略模式非常相似,将“策略”的切换部分或全部交由“策略”自己处理,这就是状态模式。

Context:环境类,客户端通过它来调用策略方法

Strategy:策略接口

Concrete StategyA/B/C:具体策略类




                3.例子,调用3个方法(策略)


策略类接口,策略方法operate()

package pers.reus.model.strategy.impl;//策略类接口public interface Strategy {public void operate();}

三个方法A,B,C

package pers.reus.model.strategy;import pers.reus.model.strategy.impl.Strategy;public class StrategyA implements Strategy{public void operate() {System.out.println("使用策略A");}}


package pers.reus.model.strategy;import pers.reus.model.strategy.impl.Strategy;public class StrategyB implements Strategy{public void operate() {System.out.println("使用策略B");}}

package pers.reus.model.strategy;import pers.reus.model.strategy.impl.Strategy;public class StrategyC implements Strategy{public void operate() {System.out.println("使用策略C");}}

环境类Context。

package pers.reus.model.context;import pers.reus.model.strategy.impl.Strategy;//环境类public class StrategyPatternContext {private Strategy strategy;      //构造函数,通过传参判断要使用哪个方法      public StrategyPatternContext(Strategy strategy){           this.strategy = strategy;      }      public void setStrategy(Strategy strategy){           this.strategy = strategy;      }      public void operate(){           this.strategy.operate();      }  }

测试:

package pers.reus.model.client;import pers.reus.model.context.StrategyPatternContext;import pers.reus.model.strategy.StrategyA;import pers.reus.model.strategy.StrategyB;import pers.reus.model.strategy.StrategyC;public class StrategyPatternClient {public static void main(String[] args) {    //声明Context    StrategyPatternContext context;     //讲A,B,C三个策略分别放入Context    context = new StrategyPatternContext(new StrategyA());    context.operate();        context = new StrategyPatternContext(new StrategyB());    context.operate();        context = new StrategyPatternContext(new StrategyC());    context.operate();}}

结果:

使用策略A使用策略B使用策略C


0 0