设计模式-行为型模式-策略模式

4.9 策略模式

  1. 模式动机与定义

    • 模式动机
      • 旅游出行方式
        • 骑自行车
        • 开飞机
        • 坐火车
      • 实现某个目标的途径不止一条,可根据实际情况选择一条适合的途径
      • 软件开发:
        • 多种算法,例如排序、查找、打折等
        • 使用硬编码(Hard Coding)实现将导致系统违背开闭原则,扩展性差,且维护困难
        • 可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法->策略类->策略模式
    • 模式定义
      • 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。
      • 策略模式让算法独立于使用它的客户而变化
      • 策略模式是一种对象行为型模式
  2. 模式结构与分析

    • 模式结构

      • 角色:

        • Context:环境类
        • Strategy:抽象策略类
        • ConcreteStrategy:具体策略类
  • 模式分析

    • 每一个封装算法的类称之为策略类(Strategy)

    • 策略模式提供了一种可插入式(Pluggable)算法的实现方案

    • 环境策略类实例代码

    • public class Context{
       private Strategy strategy; //维持一个对抽象策略类的引用
       
        //注入策略对象
       public void setStrategy(Strategy strategy){
          this.strategy = strategy;
        }
        
        //调用策略对象的方法
        public void algorithm(){
          strategy.algorithm();
        }
      }
      
  1. 模式实例与解析

    • 模式实例
    • 模式实例
  2. 模式效果与应用

    • 模式优点
      • 提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或者行为,也可以灵活地增加新的算法或行为
      • 提供了管理相关算法族的办法
      • 提供了一种可以替换继承关系的办法
      • 可以避免多重条件选择语句
      • 提供了一种算法的复用机制,不同的环境类可以方便的复用策略类
    • 模式缺点
      • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
      • 将造成系统产生很多具体策略类
      • 无法同时在客户端使用多个策略类
    • 模式应用
      • 一个系统需要动态地在几种算法中选择一种
      • 避免使用难以维护的多重条件选择语句
      • 不希望客户端知道复杂的、与算法相关的数据结构,提高算法的保密性与安全性

你可能感兴趣的:(设计模式-行为型模式-策略模式)