• 设计模式之策略模式


    定义

    策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。是一种对象行为型模式。

    动机

    • 完成一件事可以有多种不同的方式可以选择,每一种方式都是一种策略

    作用

    • 使得客户端可以根据外部条件选择不同策略来解决不同问题

    1.策略模式仅仅封装算法(包括添加 & 删除),但策略模式并不决定在何时使用何种算法,算法的选择由客户端来
    2.将算法的责任和本身进行解耦,对算法进行封装,将算法的责任和算法本身分割开,委派给不同的对象管理。
    3.让算法和对象分开来,使得算法可以独立于使用它的客户而变化

    实例

    • 以我们每天上班打卡为例每个部门的考勤规则

    • 首先有一个打卡接口

        public interface Strategy {
            void ding();
        }
      
    • 然后选择不同部门打卡

        public class StrategyA implements Strategy {
            @Override
            public void ding() {
                System.out.println("A ding 了一下!!!!!!!!!");
            }
        }
      
        public class StrategyB implements Strategy {
            @Override
            public void ding() {
                System.out.println("B ding 了一下!!!!!!");
            }
        }
      
    • 最后调用方法

        public class Context {
            private Strategy strategy;
            public Context(Strategy strategy){
                  this.strategy=strategy;
            }
      
            public static void main(String[] args) {
                Context contextA =new Context(new StrategyA());
                contextA.strategy.ding();
      
                Context contextB =new Context(new StrategyB());
                contextB.strategy.ding();
            }
        }
      
    • 输出结果为:

    A ding 了一下!!!!!!!!!
    B ding 了一下!!!!!!

    UML

    优点

    • 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
    • 策略模式提供了管理相关的算法族的办法。
    • 策略模式提供了可以替换继承关系的办法。
    • 使用策略模式可以避免使用多重条件转移语句

    缺点

    • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
    • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

    总结

    • 在策略模式中定义了一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。策略模式是一种对象行为型模式。
    • 策略模式包含三个角色:环境类在解决某个问题时可以采用多种策略,在环境类中维护一个对抽象策略类的引用实例;抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类;具体策略类实现了在抽象策略类中定义的算法。
    • 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。
    • 策略模式主要优点在于对“开闭原则”的完美支持,在不修改原有系统的基础上可以更换算法或者增加新的算法,它很好地管理算法族,提高了代码的复用性,是一种替换继承,避免多重条件转移语句的实现方式;其缺点在于客户端必须知道所有的策略类,并理解其区别,同时在一定程度上增加了系统中类的个数,可能会存在很多策略类。
    • 策略模式适用情况包括:在一个系统里面有许多类,它们之间的区别仅在于它们的行为,使用策略模式可以动态地让一个对象在许多行为中选择一种行为;一个系统需要动态地在几种算法中选择一种;避免使用难以维护的多重条件选择语句;希望在具体策略类中封装算法和与相关的数据结构。
  • 相关阅读:
    HDU-5534-Partial Tree
    Dire Wolf HDU
    HDU 5119 Happy Matt Friends (14北京区域赛 类背包dp)
    4 Values whose Sum is 0 POJ
    Fliptile POJ
    Face The Right Way POJ
    【Selenium学习】解决chromedriver.exe' executable needs to be in PATH
    【Jenkins学习】修改jenkins显示为中文语言
    【Jenkins学习】Jenkins 批量删除历史构建
    【Tomcat学习】tomcat 日志详解
  • 原文地址:https://www.cnblogs.com/xiaoxiaoliu/p/10440163.html
Copyright © 2020-2023  润新知