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

  • 相关阅读:
    ios 人脸检测
    改善用户体验的几个alert提示效果(收集整理)
    asp.net中关于《%=》《%#》《%》 的用法——(转帖)
    flash学习网址
    网页数据表格自动填充序号
    <%#..%>与<%=..%>的区别
    用Margin还是用Padding
    由浅入深漫谈margin属性
    css中导入样式表和链接样式表有什么区别,我不是问语法,而是问内在区别,还有我怎么才能体会到他们的区别
    ASP.NET Eval如何进行数据绑定
  • 原文地址:https://www.cnblogs.com/manusas/p/8043041.html
Copyright © 2011-2022 走看看