调用方自主选择策略方式:如食堂打饭,有很多窗口供选择,用户只需要去想买的窗口刷卡打饭即可
三个关键角色:
- 上下文信息类(Context):用于存放和执行需要使用的具体策略类以及客户端调用的逻辑。
- 抽象策略类(Strategy):定义策略的共有方法。
- 具体策略类(StrategyA 等):实现抽象策略类定义的共有方法
优点:调用算法和算法实现隔离;方便代码扩展和维护;减少if-else嵌套
缺点:学习成本高
// 上下文信息类:用于存放和执行需要使用的具体策略类以及客户端调用的逻辑
class HandlerContext {
private Map<Integer, Handler> temp = new HashMap<>(10);
public void putH(Integer i, Handler s){
temp.put(i, s);
}
public Handler getH(Integer i){
return temp.get(i);
}
}
// 抽象策略类:定义策略的共有方法
interface Handler{
void doHandler();
}
// 关联上下文信息类
abstract class BaseHandler implements Handler{
private HandlerContext h;
public BaseHandler(HandlerContext h){
System.out.println("this:" + this);
h.putH(10, this);
}
@Override
public void doHandler() {
System.out.println("BaseHandler");
handler();
}
public abstract void handler();
}
// 具体策略类:实现抽象策略类定义的共有方法
class SmsHandler extends BaseHandler implements Handler{
public SmsHandler(HandlerContext h) {
super(h);
}
@Override
public void handler() {
System.out.println("SmsHandler");
}
}
public class StrategyPattern{
public static void main(String[] args) throws IOException {
HandlerContext h = new HandlerContext();
BaseHandler s = new SmsHandler(h);
s.doHandler();
System.out.println("=========");
System.out.println(h.getH(10));
h.getH(10).doHandler();
}
}
标签:应该,策略,void,System,模式,println,HandlerContext,public
From: https://www.cnblogs.com/jishaling/p/17736551.html