【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
- 【Java设计模式】· 策略模式(Strategy Pattern)
- java设计模式---Strategy Pattern---策略模式
- Java设计模式--策略模式【Strategy Pattern】
- 设计模式:策略模式(Strategy Pattern)
- 设计模式----策略模式(Strategy Pattern)
- 【设计模式】策略模式(Strategy Pattern)
- 设计模式之三 --- 策略模式(Strategy Pattern) (java)
- 浅谈 java 设计模式--策略模式(Strategy pattern)
- Java设计模式-策略模式(Strategy Pattern)
- Java设计模式——策略模式(Strategy Pattern)
- Java设计模式——策略模式(Strategy Pattern)
- Java设计模式 Design Pattern:策略模式 Strategy Pattern
- Java设计模式 Design Pattern:策略模式 Strategy Pattern
- java(15)-策略模式(Strategy Pattern)
- Java 策略模式 (Strategy Pattern)
- Java Strategy Pattern(策略模式)
- Java设计模式——策略模式[Strategy Pattern]
- JAVA设计模式之 策略模式【Strategy Pattern】
- debian 常用命令说明
- POJ 3255 Roadblocks(次短路)
- iOS UITextView内容添加后,自动滚动到最后一行
- 【计蒜客系列】挑战难题30:合法分数的组合
- java面向对象内部类、抽象类、接口类
- 【Java设计模式】· 策略模式(Strategy Pattern)
- hdoj畅通工程
- trie hdu1251 字典树
- json数据解析
- Segment Game (hdu 5372 树状数组+离散化)
- Java基础总结之各个模块重要知识点
- 共享内存
- iOS推送小结
- 不敢死队问题