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

目录

一、行为型模式

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 {@Overridepublic void show() {System.out.println("春节到了,全场买一送一!");}}
/*** 具体策略类: 中秋节活动类*/
public class StrategyB implements Strategy {@Overridepublic void show() {System.out.println("中秋节到了,全场满 50 送月饼!");}}
/*** 具体策略类: 端午节活动类*/
public class StrategyC implements Strategy {@Overridepublic 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.hqwc.cn/news/129359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode ssh linux C++ 程序调试

vscode调试c++程序相比vs2022要复杂很多,vs2022可以"一键运行调试",vscode则需要自己配置。 ​vscode调试程序时,会在当前工作目录产生.vscode 目录, 该目录有两个重要文件launch.json和tasks.json, 下面介绍两种调试方法: 手动调试和自动调试。 手动调试 不管…

用 HTTP 提交数据,基本就这 5 种方式

网页开发中,向服务端提交数据是一个基本功能,工作中会大量用 xhr/fetch 的 api 或者 axios 这种封装了一层的库来做。 可能大家都写过很多 http/https 相关的代码,但是又没有梳理下它们有哪几种呢? 其实通过 http/https 向服务端…

Nosql redis高可用和持久化

Nosql redis高可用和持久化 1、redis高可用2、redis持久化2.1redis持久化2.2Redis 持久化方法2.3RDB 持久化2.3.1RDB持久化工作原理2.3.2触发条件2.3.3其他自动触发机制2.3.4执行流程2.3.5启动时加载 2.4AOF 持久化2.4.1AOF持久化原理2.4.2开启AOF2.4.3执行流程2.4.4文件重写的…

java基础 日期工具类

目录结构: DateUtils.java package dateStudy; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class DateUtils {private static final String FORMAT_1"yyyy-MM-dd HH:mm:ss";//私有方法&#xf…

简易版Pycharm(2023)+Conda开发环境配置教程

困 扰 不知道为什么,自从Pycharm更新了新的版本以后,在Pycharm中为项目工程配置Python解释器环境时,总是不能像以前那么方便。 比如,当前Conda中有十个不同的开发环境,每个环境一个名称,比如,p…

JavaScript Web APIs第五天笔记

Web APIs - 第5天笔记 目标: 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如:变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&…

1. QEMU背景知识

QEMU的两种模拟方案: 系统模拟 System Simulation:可以简单的理解为对整个计算机系统进行模拟(CPU、Memory等) 用户模式模拟 User Mode Simulation:基于模拟方案执行特定应用程序 除了模拟功能外,QUME工具…

Unity实现设计模式——模板方法模式

Unity实现设计模式——模板方法模式 模板模式(Template Pattern), 指在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 简单说, 模板方法模式定义一个操作中的算法的骨架&…

Vue 中 KeepAlive 内置缓存使用

KeepAlive 介绍及使用场景 KeepAlive 是 vue 中的内置组件&#xff0c;当多个组件动态切换时可以对实例状态进行缓存&#xff0c;用法如下 <router-view v-slot"{ Component }"><keep-alive><component :is"Component" /></keep-al…

HTML 笔记:初识 HTML(HTML文本标签、文本列表、嵌入图片、背景色、网页链接)

1 何为HTML 用来描述网页的一种语言超文本标记语言(Hyper Text Markup Language)不是一种编程语言&#xff0c;而是一种标记语言 (markup language) 2 HTML标签 HTML 标签是由尖括号包围的关键词&#xff0c;比如 <html> 作用是为了“标记”页面中的内容&#xff0c;使…

提高工作效率!本地部署Stackedit Markdown编辑器,并实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

三分钟学习一个python小知识8-----------我的对python中pandas的理解--补充,

文章目录 一、利用pandas读入excel表&#xff0c;包括csv,xlsx等格式二、利用pandas读取没有表头的表格1.引入库 三、利用pandas读取有表头的表格四、利用pandas读取表格中的第一列五、利用pandas导出为excel数据总结 一、利用pandas读入excel表&#xff0c;包括csv,xlsx等格式…