应该也算策略模式吧

调用方自主选择策略方式:如食堂打饭,有很多窗口供选择,用户只需要去想买的窗口刷卡打饭即可

三个关键角色:

  • 上下文信息类(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();

    }
}

posted @ 2023-09-28 21:43  jishaleng  阅读(7)  评论(0编辑  收藏  举报