zoukankan      html  css  js  c++  java
  • 策略模式Strategy

    简介

    策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

    角色

    • 环境(Context):持有一个Strategy的引用
    • 抽象策略(Strategy):一个抽象角色(一个接口或抽象类),定义所有支持的算法的公共接口。
    • 具体策略(ConcreteStrategy):实现了接口,包装了具体的算法或行为。

    类图

    示例

    环境

    public class Context {
        protected Strategy strategy;
    
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
    
        public void action() {
            strategy.action();
        }
    }

    抽象策略

    public interface Strategy {
        void action();
    }

    具体策略

    public class ConcreteStrategy1 implements Strategy {
        public void action() {
            System.out.println("行为1");
        }
    }
    public class ConcreteStrategy2 implements Strategy {
        public void action() {
            System.out.println("行为2");
        }
    }

    测试&结果

    public class Client {
        public static void main(String[] args) {
            Strategy strategy = new ConcreteStrategy1();
            Context context = new Context(strategy);
            context.action();//行为1
        }
    }

    优缺点

    优点

    • 动态的改变对象的行为,避免代码重复。
    • 避免使用多重条件(if-else)语句,多重条件语句不易维护。

    缺点

    • 客户端必须知道所有的策略类(也不需要所有,满足自己的需求吧),并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况
    • 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很多。

    Head First 设计模式(中文版)的示例:

    码云地址:https://gitee.com/manusas/StrategyDP

  • 相关阅读:
    16. Vue 登录存储
    JS 10位、13位时间戳转日期
    14.Vue 定义全局函数
    13.Vue+Element UI实现复制内容
    12.Vue+Element UI 获取input的值
    11.Vue安装Axios及使用
    Layui入手
    MongoDB自启动设置
    sql数据统计
    sql查询总结
  • 原文地址:https://www.cnblogs.com/manusas/p/8043041.html
Copyright © 2011-2022 走看看