策略模式和状态模式

策略模式

在上下文中携带策略接口作为成员变量,在使用上下文之前需要设置策略setStrategy(),然后使用策略接口成员变量来进行策略的执行。
在这里插入图片描述

步骤1:定义策略接口

// 策略接口
public interface Strategy {int execute(int a, int b);
}

步骤2:实现具体策略类

// 具体策略类:加法
public class ConcreteStrategyAdd implements Strategy {@Overridepublic int execute(int a, int b) {return a + b;}
}

// 具体策略类:减法

public class ConcreteStrategySubtract implements Strategy {@Overridepublic int execute(int a, int b) {return a - b;}
}

步骤3:创建上下文类

// 上下文类
public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}//使用成员变量执行public int executeStrategy(int a, int b) {return strategy.execute(a, b);}
}

步骤4:编写客户端代码

public class Main {public static void main(String[] args) {// 使用加法策略Context context = new Context(new ConcreteStrategyAdd());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));// 切换到减法策略context.setStrategy(new ConcreteStrategySubtract());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));}
}

运行结果

10 + 5 = 15
10 - 5 = 5

策略模式的例子:线程池的拒绝策略

在这里插入图片描述
在这里插入图片描述

策略模式加工厂模式

在策略上下文类中使用一个策略生成的工厂类,然后工厂类会根据执行策略执行的方法传入参数来生成策略并且设置为策略上下文的成员变量,然后执行。

状态模式

和策略模式一样,都是有一个接口成员变量作为实际的执行者,通过设置这个成员变量使得上下文类能执行不同的状态的操作。

// 状态接口
public interface State {void handle(Context context);
}// 具体状态类:开
public class OnState implements State {@Overridepublic void handle(Context context) {System.out.println("Light is turning off.");context.setState(new OffState());}
}// 具体状态类:关
public class OffState implements State {@Overridepublic void handle(Context context) {System.out.println("Light is turning on.");context.setState(new OnState());}
}// 上下文类
public class Context {private State state;public Context(State state) {this.state = state;}public void setState(State state) {this.state = state;}public void request() {state.handle(this);}
}// 客户端代码
public class Main {public static void main(String[] args) {Context context = new Context(new OffState());context.request(); // Light is turning on.context.request(); // Light is turning off.}
}

策略模式和状态模式的差异

状态可以由状态成员变量执行过程中改变。
例如:

// 具体状态类:关
public class OffState implements State {@Overridepublic void handle(Context context) {System.out.println("Light is turning on.");context.setState(new OnState());}
}

而策略模式只是执行策略。

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

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

相关文章

猎豹WiFi

猎豹WiFi,记得刚安装完就一堆广告弹窗,然后删除了一些东西,不影响开热点的功能。 kwifi.zip - 蓝奏云

干涉阵型成图参数记录【robust】

robust 这个玩意经常忘记,就是取2的时候是更加显示大尺度的结构,取-2更加显示小尺度结果,一般取0就是正常就好了

真正要战胜的,不是困难,是自己

记录一些好的文字,希望可以和大家共勉。 一个人真正的成长,是战胜自己 不知你是否有这样的经历:曾经觉得一道题很难,但解出来后,发现其实并没那么难;曾经觉得一件事是不可能完成的,但历经千辛万…

vitest-前端单元测试

Vitest是一个轻量级、快速且功能强大的测试框架,特别适用于Vite项目,但也可以与其他前端项目(如使用webpack构建的项目)集成使用。Vitest提供极速的测试体验,并包含一系列用于编写和组织测试用例的API,如de…

vue项目中,pnpm不能用-解决

方法四:解决 PowerShell 执行策略问题 如果你决定继续使用 PowerShell,并且遇到执行策略问题,可以尝试以下方法解决: 永久更改执行策略: 在管理员权限的 PowerShell 中运行以下命令,以永久更改执行策略&am…

【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】

前言: 💞💞大家好,我是书生♡,今天主要和大家分享一下Hive中常见的优化手段----数据采集!常见的Join 优化有哪几种!什么是Hive索引!数据怎么发生倾斜!什么是mapreduce的本…

力扣每日一题 6/24 模拟 数组 单调栈

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 503.下一个更大元素II 【中等】 题目: 给定一个循环数组 nums…

数据分析师怎么去快速读一本书

背景:优秀的数据分析师怎么去快速读一本书 一本好书的判断依据 1.有没有再次印刷,三次印刷一般是好书 2.作者 快读选书顺序 1.目录->定位这是一本什么书 2.看内容的呈现形式,内容的各部分占比大概是什么类型的信息。 3.去看自己擅长的知…

使用原子子表创建可重用的子组件

原子子表是一个图形对象,可帮助您在Stateflow图表中创建独立的子部件。原子子表允许: 对具有多个状态或层次结构的图表进行微小更改后,模拟速度更快。 在多个图表和模型中重复使用相同的状态或子表。 易于团队开发,适用于在同一图…

在现代多核和多线程环境中,如何优化 C 语言程序以充分利用硬件并行性?

在现代多核和多线程环境中,要优化C语言程序以充分利用硬件并行性,可以考虑以下几点: 并行算法设计:将任务分解为多个独立的子任务,并使用多线程或多进程同时执行这些子任务。这可以通过将问题分解为多个部分&#xff0…

小阿轩yx-MySQL备份与恢复

小阿轩yx-MySQL备份与恢复 企业对信息系统依赖性越来预高,数据库担任着重要角色如果发生意外宕机或数据丢失,损失是非常严重的数据库管理员必须针对具体的业务要求制定详细的数据库备份与灾难恢复策略 对数据库要求高的行业 银行证券电信等 MySQL 数…

PHP的SHA256WithRSA签名和Curl POST请求函数

getCustomerEncryptionKey - 获取加密秘钥 /** * 获取加密秘钥 * param array $params * return string */ public function getCustomerEncryptionKey(array $params): string { //1.ASCII码(字典序-升序)排序…

Python网络爬虫实战6—下一页,模拟用户点击,切换窗口

【前期提要】感兴趣的可以看看往期文章哈~ Python网络爬虫5-实战网页爬取 Python网络爬虫4-实战爬取pdf Pyhon网络爬虫3-模拟用户点击 Python网络爬虫实战2-下载url下的pdf Python网络爬虫基础1 1.需求背景 针对长虹美菱电器说明书网页形式,编写爬虫代码&#xff…

IO模型简介

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言简介正文实现总结 前言 简介 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程 序的时候,会面临一些巨大的挑战和困难,主要问题如下…

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.11 HAL_PCD_SOFCallback1.12 HAL_PCD_ResetCallback1.13 HAL_PCD_SuspendCallback1.14 HAL_PCD_ResumeCallback1.15 HAL_PCD_ISOOUTIncompleteCallback1.16 HAL_PCD_ISOINIncompleteCallbac…

【财务数字化转型之底座】集团企业财务数据中台系统建设方案

引言:随着企业规模的不断扩大和业务的复杂化,传统的财务管理模式已难以满足集团企业的数据整合、分析和决策需求。因此,建设一个高效、稳定、安全的财务数据中台系统,成为集团企业数字化转型的重要一环。本方案旨在构建一个集数据…

Android SurfaceFlinger——无效化和同步信号回调(十)

上一篇文章分析了屏幕热插拔回调回调,同时通过前面文章的介绍,我们知道一共有三个比较重要的回调,这里我们看一看另外两个回调函数无效化和垂直同步的相关调用。 一、回调介绍 这两个回调从表面看都是通知屏幕刷新的,但本质上还是有区别的。 无效化回调(Invalidate Hook…

算力服务先锋!和鲸科技入选《2024中国智算产业生态图谱》

2024 年 6 月 18 日,由科智咨询发起的《2024中国智算产业生态图谱》正式发布,依托 ModelWhale 构建的智算算力资源服务,以及深耕多年的 ModelWhale 数据科学协同平台优势,和鲸科技成功入选。 “智算时代”技术不断进步&#xff0c…

Open vSwitch 内核空间的流表同步

一、内核空间的流表同步 在 Open vSwitch 的数据包转发过程中,当数据包在 Datapath 模块无法完全处理时,会通过 upcall 调用将数据包交给用户空间的 vswitchd 守护进程,由 vswitchd 守护进程生成相应的流表和行为,并发送回内核空间…

什么是空间复杂度?

空间复杂度 是指算法在计算机中执行时所需额外空间的度量,记作S(n)。这个空间包括算法在执行时所使用的所有额外存储空间,包括变量(包括静态变量和动态变量)、递归调用栈、以及输入输出数据所占据的存储空间等。其中,n…