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

  • 相关阅读:
    视频实例分割 | Target-Aware Adaptive Tracking for Unsupervised Video Object Segmentation
    目标检测算法:Selective Search(选择性搜索)简述
    [2020BUAA软工助教]期末总结
    WPF,数据验证方案,验证通过才能继续下一步
    WPF:解决数据验证ValidationRule与按钮Canexcute联动的问题
    解决mininet运行报错“ImportError: No module named mininet.log”
    交易所对接ERC20钱包端口要多长时间?
    尺子的刻度
    学习java的第四周
    学习java的第三周
  • 原文地址:https://www.cnblogs.com/manusas/p/8043041.html
Copyright © 2020-2023  润新知