首页 > 其他分享 >策略模式(Strategy Pattern)

策略模式(Strategy Pattern)

时间:2023-05-22 20:46:17浏览次数:44  
标签:策略 Pattern void 模式 strategy 算法 Strategy public

一、模式动机

策略模式(Strategy Pattern)用于算法的自由切换和扩展,是一种使用较为广泛的行为型模式。策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便地更换算法或者增加新的算法。它将每一个算法封装在一个称为具体策略的类中,同时为其提供统一的抽象策略类,而使用这些算法完成某一业务功能的类称为环境类
策略模式实现了算法定义和算法使用的分离,它通过继承和多态的机制实现对算法族的使用和管理,是一种简单易用的对象行为型模式。

  • 实现某个目标的途径不止一条,可根据实际情况选择一条合适的途径
  • 软件开发:
    • 多种算法,例如排序、查找、打折等
    • 使用硬编码(Hard Coding)实现将导致系统违背开闭原则,扩展性差,且维护困难
  • 可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法 ——> 策略类 ——> 策略模式

二、模式定义

  • 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。
  • 策略模式让算法独立于使用它的客户而变化
  • 又称为政策(Policy)模式
  • 每一个封装算法的类称之为策略(Strategy)类
  • 策略模式提供了一种可插入式(Pluggable)算法的实现方案
  • 策略模式是一种对象行为型模式

三、模式结构

image


抽象策略类

public abstract class Strategy {
    public abstract void algorithm( );  //声明抽象算法
}

具体策略类

public class ConcreteStrategyA extends Strategy {
    //算法的具体实现
    public void algorithm( ) {
        //算法A
    }
}

环境类

public class Context {
    private Strategy strategy; //维持一个对抽象策略类的引用
    //注入策略对象
    public void setStrategy(Strategy strategy) {
        this.strategy= strategy;
    }
    //调用策略类中的算法
    public void algorithm( ) {
        strategy.algorithm( );
    }
}

客户类

……
Context context = new Context( );
Strategy strategy;
strategy = new ConcreteStrategyA( );
             //可在运行时指定类型,通过配置文件和反射机制实现
context.setStrategy(strategy);
context.algorithm( );
……

四、案例实现

案例背景

旅游选择不同的出行方式

案例结构

image

代码实现

环境类:Persion

public class Person {

    private TravelStrategy strategy;

    public void setStrategy(TravelStrategy strategy) {
        this.strategy = strategy;
    }

    public void travel(){
        strategy.travel();
    }
}

抽象策略类

public interface TravelStrategy {

    void travel();

}

具体策略类

public class BicycleStrategy implements TravelStrategy{
    @Override
    public void travel() {
        System.out.println("自行车游!");
    }
}

具体策略类

public class WorkStrategy implements TravelStrategy{
    @Override
    public void travel() {
        System.out.println("徒步旅行!");
    }
}

具体策略类

public class TrainStrategy implements TravelStrategy{
    @Override
    public void travel() {
        System.out.println("乘火车旅行!");
    }
}

具体策略类

public class AirplaneStategy implements TravelStrategy{
    @Override
    public void travel() {
        System.out.println("飞机旅行!");
    }
}

客户类

public class Client {
    public static void main(String[] args) {

        Person person = new Person();
        TravelStrategy strategy = (TravelStrategy) XMLUtil.getBean();
        person.setStrategy(strategy);
        person.travel();
    }

}

五、总结

模式优点

  • 提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为
  • 提供了管理相关的算法族的办法
  • 提供了一种可以替换继承关系的办法
  • 可以避免多重条件选择语句
  • 提供了一种算法的复用机制,不同的环境类可以方便地复用策略类

模式缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 将造成系统产生很多具体策略类
  • 无法同时在客户端使用多个策略类

使用情形

  • 一个系统需要动态地在几种算法中选择一种
  • 避免使用难以维护的多重条件选择语句
  • 不希望客户端知道复杂的、与算法相关的数据结构,提高算法的保密性与安全性

标签:策略,Pattern,void,模式,strategy,算法,Strategy,public
From: https://www.cnblogs.com/sorrymine/p/17421669.html

相关文章

  • 状态模式(Sate Pattern)
    一、模式动机状态模式(StatePattern)是一种较为复杂的行为型模式。它用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对......
  • 设计模式——访问者模式
    访问者模式(VisitorPattern)是GoF提出的23种设计模式中的一种,属于行为模式。据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。定义(源于GoF《DesignPattern》):表示一个作用于某对象结构中的各元素的操作。ClassVisitor和MethodVisitor都是访问者模式......
  • iOS GCD 和信号量 实现 生产者和消费者模式
    GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。一、dispatch组(dispatchgroup)1.创建dispatch组dispatch_group_tgroup=dispatch_group_create();2.启动dispatch队列中的block关联到group中dispatch_group_async(group,queue,^{//。。。});3.......
  • 观察者模式(Observer Pattern)
    一、模式动机观察者模式用于描述对象之间的依赖关系,它引入了观察者和观察目标两类不同的角色,由于提供了抽象层,它使得增加新的观察者和观察目标都很方便。观察者模式广泛应用于各种编程语言的事件处理模型中,Java语言也提供了对观察者模式的全面支持。一个对象的状态或行为的变......
  • 迭代器模式(Interator Pattern)
    一、模式动机迭代器模式(IteratorPattern)是一种使用频率非常高的行为型设计模式,迭代器用于对一个聚合对象进行遍历。通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成,简化了聚合对象的设计,更符合“单一职责原则”的要求。......
  • 块、行元素的显示模式
    一、块元素CSS的元素显示模式常见的块元素有h1~h6、p、div、ul、ol、li等,其中div标签是最典型的块元素。1.1块元素块级元素的特点:①比较霸道,自己独占一行。②高度,宽度、外边距以及内边距都可以控制。③宽度默认是容器(父级宽度)的100%。④是一个容器及盒子,里面可以放......
  • 命令模式(Command Pattern)
    一、模式动机命令模式(CommandPattern)是一种常用的行为型设计模式,它将请求发送者与请求接收者解耦,请求发送者通过命令对象来间接引用接收者,使得系统具有更好的灵活性,可以在不修改现有系统源代码的情况下将相同的发送者对应不同的接收者,也可以将多个命令对象组合成宏命令,还可以在......
  • 读书笔记 软件需求模式
    前面了解到什么事需求的,接下来就应该学习如何使用和编写需求模式。我们不仅到了解需求模式的含义,更要学会在什么情况下使用需求模式。在定义系统期间,有两种场合使用需求模式:1.当定义需求时,看是否存在一个模式可以指导如何定义这种需求。2.当考虑系统需求是否完全时,浏览主题覆盖......
  • AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变
    本图由AI生成  黄仁勋说的AI发展迎来iPhone时刻,对NVIDIA有什么影响?文/王吉伟 近期的AIGC领域仍旧火爆异常。但火的不只是AIGC应用,还有巨头之间的AI竞赛,以及接连不断上新的AI大模型(LLM,LargeLanguageModel)。面对ChatGPT带来的技术冲击,为了研发谷歌多模态AI模型及应对......
  • 行为型模式(Behavioer Pattern)
    行为型设计模式行为型模式定义了系统中对象之间的交互与通信,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责,包括对系统中较为复杂的流程的控制。在软件系统运行时对象并不是孤立存在的,它们可以通过相互通信和协作完成某些功能,一个对象在运行时也将影响其他对象......