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

    定义

    策略模式是一个在可以在运行时选择算法行为的设计模式。

    策略模式:

    • 定义了一个算法族

    • 封装每个算法

    • 族内的算法可以相互替换

    此模式让算法的变化独立于使用算法的客户。使用策略模式时,我们可以通过输入数据、数据的类型或者其他可以识别的因素来选择不同的算法,这些因素我们直到运行时才能获取到。

    比如不同的薪资有不同的个人所得税算法,购物时花费不同的价格有不同的优惠策略,交税在不同国家有不同的计算方法等等。我们可以定义一系列对应的策略算法,之后通过个人薪资、花费的价格、所在的地区,选择对应的策略进行计算。

    使用

    定义一个策略接口和几个实现此接口的类,客户端持有一个策略接口,在运行时根据输入数据等信息选择对应的具题策略赋值给接口,之后执行策略接口的方法(即对应的具体实现类中实现的方法)。

    对于不熟悉上面UML的可以阅读深入浅出UML类图看懂UML类图和时序图了解一下。

    代码(Java)

    // 策略接口
    public interface Strategy {
        void execute();
    }
    ​
    // 具体策略类A
    public class ConcreteStrategyA implements Strategy {
        @Override
        public void execute() {
            System.out.println("This is ConcreteStrategyA");
        }
    }
    ​
    // 具体策略类B
    public class ConcreteStrategyB implements Strategy {
        @Override
        public void execute() {
            System.out.println("This is ConcreteStrategyB");
        }
    }
    ​
    // 用户类
    public class Context { 
        private Strategy strategy;
    ​
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
    ​
        public Strategy getStrategy() {
            return strategy;
        }
    ​
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
    ​
        // 用户方法,执行具体赋值的策略的计算方法
        public void execute() {
            System.out.println("context execute");
            strategy.execute();
        }
    ​
        public static void main(String[] args) {
            Context context = new Context(new ConcreteStrategyA());
            context.execute();
    ​
            // 可以根据输入的数据等信息进行判断,设置对应的具体策略来执行
            context.setStrategy(new ConcreteStrategyB());
            context.execute();
        }
    }

    总结

    策略模式主要是找出应用中可能需要变化之处,把它们独立出来进行封装,不和那些不需要变化的代码混在一起。

    这样可以独立出最小的部分来进行复用,避免了有很多的将易变和不变部分混合在一起的实现类,导致出现重复代码的情况。

    同时策略模式符合开-闭原则,对扩展开发,对修改关闭,当有新的策略出现的时候,只要添加一个对应的继承策略接口的具体类即可,不需修改其他策略。

  • 相关阅读:
    awk
    tac
    cat
    less
    more
    head
    vim
    linux安装redis
    Redis for Python开发手册
    Python3.x标准模块库目录
  • 原文地址:https://www.cnblogs.com/zawier/p/6874828.html
Copyright © 2011-2022 走看看