策略模式:
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