策略模式和状态模式

策略模式

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

步骤1:定义策略接口

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

步骤2:实现具体策略类

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

// 具体策略类:减法

public class ConcreteStrategySubtract implements Strategy {
    @Override
    public 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 {
    @Override
    public void handle(Context context) {
        System.out.println("Light is turning off.");
        context.setState(new OffState());
    }
}

// 具体状态类:关
public class OffState implements State {
    @Override
    public 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 {
    @Override
    public void handle(Context context) {
        System.out.println("Light is turning on.");
        context.setState(new OnState());
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

酒店民宿预订小程序:高效管理,便捷入住

目前,我国旅游业发展非常旺盛,同时也带动了酒店民宿的快速发展。随着互联网科技的快速发展,酒店民宿小程序层出不穷。一个高效的小程序目前已经成为了各大服务业中必不可少的环节,对于酒店民宿商家来说,线上小程序不仅…

Day.js

Day.js 是什么? Day.js是一个极简的JavaScript库,可以为现代浏览器解析、验证、操作和显示日期和时间。 Day.js中文网 为什么要使用Day.js ? 因为Day.js文件只有2KB左右,下载、解析和执行的JavaScript更少,为代码留下更…

2024/5/9【贪心5/5】--代码随想录算法训练营day36|56. 合并区间、738.单调递增的数字、968.监控二叉树 (可跳过)

56. 合并区间 力扣链接 class Solution:def merge(self, intervals):result []if len(intervals) 0:return result # 区间集合为空直接返回intervals.sort(keylambda x: x[0]) # 按照区间的左边界进行排序result.append(intervals[0]) # 第一个区间可以直接放入结果集中…

Java 树形结构数据如何高效返回给前端进行展示?

在开发过程中我们总是遇到一些具有层次结构的数据,这些数据在前端也总是需要以树形结构进行显示,那么后端接口如何高效的去将这些数据封装成树形结构呢?下面来进行解析讲解。 最终实现的一个结果图 设计返回的实体VO import com.fasterxm…

58.鸿蒙系统app(HarmonyOS)(ArkUI)更改应用程序图标

替换xx\MyApplication4.30\entry\src\main\resources\base\media目录下icon.png文件 54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试_鸿蒙socket连接测试-CSDN博客

windows远程桌面你会了吗?

1、当你发现正常连接无法连接时? 试试以管理员身份连接 mstsc /admin /v:IP 2、当本机与远程桌面分辨率不一致时? 指定分辨率连接,如1920*1080 mstsc /w:1920 /h:1080 /v:IP 适应本机分辨率连接 mstsc /span /v:IP 3、当远程连接的端口不是3389…

【设计模式-04】原型模式

【设计模式-04】原型模式 1. 概述2. 结构3. 实现4. 案例5. 使用场景6. 优缺点6.1 原型模式的优点6.2 原型模式的缺点 7. 实现深克隆(深拷贝) 1. 概述 原型模式: 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型…

VSCode常用的一些插件

Chinese (Simplified) 汉语(简体)拓展包。 Auto Close Tag 可以自动增加xml/html的闭合标签。 CodeSnap 截图神器。截图效果在下面。 Dracula Official vscode一个很好看的主题。 Git Graph git管理工具。 GitHub Repositories 有了它,不…

基于Vue+ElementUI框架实现学生管理系统前端页面设计

目录 一. 最终效果展示 二. 详细教程 1. 创建项目 2. 下载组件 3. 在main.js中配置 4. 创建项目中的组件(页面) 登录组件 Login.vue 系统主页组件 Main.vue 学生管理组件 StudentList.vue 专业管理组件 MajorList.vue 5. 在index.js中配置组件路由 6. 添加画布 三…

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕&a…

算法金 | 没有思考过 Embedding,不足以谈 AI

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 在当今的人工智能(AI)领域,Embedding 是一个不可或缺的概念。如果你没有…

第六篇:精通Docker Compose:打造高效的多容器应用环境

精通Docker Compose:打造高效的多容器应用环境 1. 引言 1.1 目的与重要性 在现代软件开发中,随着应用程序的复杂性不断增加,传统的单一容器部署方式已无法满足需求。Docker Compose作为一种强大的工具,专门用于定义和运行多容器…

用户中心项目全流程

企业做项目流程 需求分析 > 设计(概要设计 、 详细设计) > 技术选型 >初始化项目 / 引入需要的技术 > 写个小demo > 写代码 (实现业务逻辑) > 测试(单元测试)> 代码提交 / 代码评审 …

【C++:list】

list概念 list是一个带头的双向循环链表,双向循环链表的特色:每一个节点拥有两 个指针进行维护,俩指针分别为prev和next,prev指该节点的前一个节点,next为该节点的后一个节点 list的底层实现中为什么对迭代器单独写一个结构体进行…

Toco x Databend:Databend Cloud 如何满足 Web3 大数据服务的严苛考验?

Toco 是一家位于瑞士的 Web3 服务提供商,致力于通过彻底改变全球金融体系的陈旧观念来应对气候变化。他们提供了一种开创性的碳货币 Tocos,每个流通中的 Tocos 代表一吨二氧化碳当量,存储在安全可靠的数字钱包中。用户可以使用 Tocos 应用轻松…

Jmeter+InfluxDB+Grafana性能测试数据展示

JmeterInfluxDBGrafana提供了一种更好的对Jmeter压测结果的实时监控展示。可以理解为数据源产生的数据加上时间记录并存储,然后使用各种开源图表组件进行展示。实现jmeter报告的更好的可视化展示 1)方便测试结果数据落地以及更好的分析 2)将…

计算机视觉-期末复习-简答/名词解释/综合设计

目录 第一讲--计算机/机器视觉概述 名词解释 简答 第二讲--图像处理概述 名词解释 简答 第三讲没划重点习题 第四讲--特征提取与选择 名词解释 简答 综合题 第五讲--不变特征 名词解释 简答 第六讲--物体分类与检测 简答 综合题 第七讲--视觉注意机制 简答 …

鸿蒙期末项目(完结)

两天仅睡3个小时的努力奋斗之下,终于写完了这个无比拉跨的项目,最后一篇博客总体展示一下本项目运行效果兼测试,随后就是答辩被同学乱沙(悲 刚打开软件,会看到如下欢迎界面,介绍本app的功能和优点 随后我们…

基于模型蒸馏的模型加速方案总结

1.简介 1.1目的 在过去的一段时间里,对基于模型蒸馏技术的模型加速方案的方法在多个数据集上进行了一系列的实验。所谓的模型蒸馏技术,简单的来说就是利用一个设计简单的小网络去学习一个设计比较复杂的大网络。特别的有,本次实验针对每一个…

串口通信例子SeriaPort

本篇例子使用的虚拟串口转自这位博主:http://t.csdnimg.cn/LSGIs 串口COM: 是一种用于联接计算机和外设设备的接口,也叫串行接口,简称com,常见的串口有一般电脑应用的RS-232(使用25帧或者9帧的连接器) 通俗来讲串口就是usb接口、鼠标窗口。键…