设计模式 - 行为型模式:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

news2024/9/24 23:32:58

目录

一、行为型模式

1.1、策略模式

1.1.1、概论

1.1.2、案例实现

1.1.3、优缺点

1.1.4、使用场景


一、行为型模式


1.1、策略模式

1.1.1、概论

策略模式设计的每一个算法都封装了起来,使他们可以相互替换,通过一个对象委派不同的算法给相应的客户进行使用.

例如一家百货公司,规定在逢年过节的时候进行促销活动.  针对不同的节日(春节、中秋节、端午节)推出不同的促销活动,然后由 促销员 将促销活动展示给客户. 

策略模式主要角色如下:

  • 抽象策略类:由一个接口或者抽象类来实现,给出了所有 具体策略类 所需的接口.
  • 提交策略类:实现了抽下你个策略定义的接口,提供具体的算法实现.
  • 环境类:持有一个策略类引用,最终给客户端调用.

1.1.2、案例实现

针对以上案例进行实现.

/**
 * 抽象策略: 促销活动接口
 */
public interface Strategy {

    void show();

}
/**
 * 具体策略类: 春节活动类
 */
public class StrategyA implements Strategy {

    @Override
    public void show() {
        System.out.println("春节到了,全场买一送一!");
    }

}
/**
 * 具体策略类: 中秋节活动类
 */
public class StrategyB implements Strategy {

    @Override
    public void show() {
        System.out.println("中秋节到了,全场满 50 送月饼!");
    }

}
/**
 * 具体策略类: 端午节活动类
 */
public class StrategyC implements Strategy {

    @Override
    public void show() {
        System.out.println("端午节到了,全场满 80 送粽子!");
    }

}
/**
 * 环境类: 销售员类
 */
public class SalesMan {

    private Strategy strategy;

    public SalesMan(Strategy strategy) {
        this.strategy = strategy;
    }

    public Strategy getStrategy() {
        return strategy;
    }

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

    public void showAction() {
        strategy.show();
    }

}
public class Client {

    public static void main(String[] args) {
        //1.春节
        SalesMan man = new SalesMan(new StrategyA());
        man.showAction();
        System.out.println("======================");
        //2.中秋节
        man.setStrategy(new StrategyB());
        man.showAction();
        System.out.println("======================");
        //3.端午节
        man.setStrategy(new StrategyC());
        man.showAction();
        System.out.println("======================");
    }

}

执行结果如下:

1.1.3、优缺点

优点:

  • 策略类之间可以自由切换:由于策略类都实现同一个接口,所以使得他们之间可以根据不同的需求场景任意切换.
  • 易扩展,符合开闭原则:增加一个新的的策略只需要添加一个具体的策略类即可,不需要修改原有代码.
  • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想.

缺点:

客户端必须知道所有的策略类,并自行决定使用哪个策略类.

策略模式将造成产生多个策略类(一个策略产生一个类).

1.1.4、使用场景

  1. 一个系统需要动态的在几种算法中选择一种时,可以将每个算法封装到策略类中.
  2. 一个类定义了多个行为,并且这些行为在这个类中以多个条件语句(if else)出现,就可以将每个分支移入他们各自的策略类中以替代这些条件语句.
  3. 每个策略算法彼此独立,要对客户隐藏具体算法实现细节.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dubbo 环境隔离

通过标签实现流量隔离环境(灰度、多套开发环境等) 无论是在日常开发测试环境,还是在预发生产环境,我们经常都会遇到流量隔离环境的需求。 在日常开发中,为了避免开发测试过程中互相干扰,我们有搭建多套独…

基于AlexNet深度学习网络的智能垃圾分类系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基于AlexNet深度学习网络的智能垃圾分类系统概述 4.2、基于AlexNet深度学习网络的智能垃圾分类系统主要原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab20…

MySQ 学习笔记

1.MySQL(老版)基础 开启MySQL服务: net start mysql mysql为安装时的名称 关闭MySQL服务: net stop mysql 注: 需管理员模式下运行Dos命令 . 打开服务窗口命令 services.msc 登录MySQL服务: mysql [-h localhost -P 3306] -u root -p****** Navicat常用快捷键 键动作CTRLG设…

C语言——文件操作_学习笔记

一、引言——为什么使用文件 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的…

仅用61行代码,你也能从零训练大模型

本文并非基于微调训练模型,而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇,你将了解训练出一个大模型的环境准备、数据准备,生成分词,模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运…

C++ 类和对象篇(三) 空类和6个默认成员函数

目录 一、空类 1. 是什么? 2. 空类中的成员 3. 空类的大小 二、6个默认成员函数 三、 构造函数 1. 构造函数是什么? 2. 为什么C要引入构造函数? 四、析构函数 1. 析构函数是什么? 2. 为什么要有析构函数? 五、拷贝构造…

硬件信号协议UART是干啥的?

UART协议是电子传输中一种常见的信号协议,通常只需要三根信号线就可以完成数据的收发,分别是TX,RX,GND。 UART(universal asynchronous receiver transmitter),是通用异步收发器,因为是异步,所以…

312.戳气球

将戳气球转换到添加气球&#xff0c;记忆搜索slove(i,j)&#xff1a;在开区间(i,j)全部填满气球得到的最多硬币数&#xff0c;两端val[i]、val[j] class Solution { public:vector<vector<int>> ans;vector<int> val;int slove(int left,int right){if(left&…

分布式存储系统如何应对SSD硬盘UNC坏块可靠性问题?

Uncorrectable Bit Errors&#xff08;UNC&#xff09;&#xff0c;也有时候叫做Media Error&#xff08;介质错误&#xff09;是指在闪存设备中出现的无法修复的位错误。Media Error的产生意味着即使硬盘自身已经用尽了所有容错手段&#xff08;如LDPC解码&#xff0c;retry等…

75.颜色分类

原地排序&#xff1a;空间复杂度为1 class Solution { public:void sortColors(vector<int>& nums) {if(0){//法一&#xff1a;单指针两个遍历int nnums.size();int ptr0;for(int i0;i<n;i){if(nums[i]0){swap(nums[i],nums[ptr]);ptr;}}for(int iptr;i<n;i){…

win11安装双系统Ubuntu的坎坷记录

之前一直装的都是在一个硬盘中&#xff0c;这是是两块盘。 我的电脑是惠普暗影精灵8Pro 一 安装前的准备工作 1.1 记得先关闭&#xff0c;Bitlocker 输入wins&#xff0c;搜索框输入&#xff1a;设备加密设置 1.2 BIOS设置 &#xff08;惠普这电脑是开机时按 F10&#xff0…

断点测试怎么做,一文教你用Charles 工具做好接口测试!

在测试工作过程中&#xff0c;我们经常会在程序的某一行或者某一环节设置断点&#xff0c;在程序请求的过程中&#xff0c;修改断点处的参数、请求或者响应&#xff0c;这就是所谓的断点测试。这类断点测试主要用于接口测试。 断点测试可以通过查看接口返回数据可以方便定位是前…

015-衍生版本开发

衍生版本开发 文章目录 衍生版本开发项目介绍衍生版本开发波形分析设置CPU 亲缘性 总结 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#…

【Linux】基本指令-入门级文件操作(一)

目录 前言 ⭕linux的树状文件结构 ⭕绝对路径和相对路径 ⭕当前路径和上级路径 ⭕隐藏文件 基本指令&#xff08;重点&#xff09; 1 pwd 指令 2 mkdir 指令 3 touch 指令 4 ls 指令 4.1 ls只加选项不加文件/目录名&#xff0c;默认查看当前目录下的文件 4.1.1 ls -a…

360 G800行车记录仪,不使用降压线如何开机,8芯插头的定义。

G800记录仪的插头是这样的&#xff0c;图中标出了线的颜色。其中红色为常电V&#xff0c;黑色为GND负极&#xff0c;黄色为ACC受车是否启动控制。 这个记录仪原装的电源线没有降压功能&#xff0c;所以这里的V是12V。 记录仪内部有电源板&#xff0c;负责将12V降压为5V。 如果…

CSS盒子定位的扩张

定位的扩展 绝对定位&#xff08;固定定位&#xff09;会完全压住盒子 浮动元素不会压住下面标准流的文字&#xff0c;而绝对定位或固定位会压住下面标准流的所有内容 如果一个盒子既有向左又有向右&#xff0c;则执行左&#xff0c;同理执行上 显示隐藏 display: none&…

Tasmota系统之MQTT配置和使用篇

Tasmota系统之MQTT配置和使用篇 &#x1f6a9;相关篇《ESP32/ESP8266在线刷写Sonoff Tasmota固件以及配置简要》&#x1f4cc;《Tasmota系统之外设配置》&#x1f4cd;Tasmota官方对MQTT功能使用介绍&#xff1a;https://tasmota.github.io/docs/MQTT/ &#x1f6e0;MQTT本地化…

消息队列 Kafka

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域 为什么使用消息队列MQ 在高并发环境下&#xff0c;同步请求来不及处理会发生堵塞&#xff0c;从而触发too many conne…

团队协作中如何处理ConflictingBeanDefinitionException异常

&#x1f47c; 前言 当使用Spring框架进行Java应用程序开发时&#xff0c;可能会遇到ConflictingBeanDefinitionException异常。 如&#xff1a; org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘xxxBean’ …

Spring5应用之AOP注解编程

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言开发…