策略模式和状态模式

news2024/9/19 10:51:22

策略模式

在上下文中携带策略接口作为成员变量,在使用上下文之前需要设置策略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());
    }
}

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

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

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

相关文章

面试突击:ArrayList源码详解

本文已收录于:https://github.com/danmuking/all-in-one(持续更新) 前言 哈喽,大家好,我是 DanMu。ArrayList 是我们日常开发中不可避免要使用到的一个类,并且在面试过程中也是一个非常高频的知识点&#…

酷睿Ultra 200V系CPU全阵容规格、跑分出炉:拉了坨大的

从最近几个月 12 代酷睿 CPU 大面积降价清库存,到 13、14 代高端 U 大范围翻车问题迟迟得不到解决。 这就很难不让人生出一种 Intel 似乎真无暇顾及老款 U,而是将有限精力通通放在了接下来酷睿 Ultra 处理器上的感觉。 当然,作为新工艺、新架…

【编译原理必考大题】 推导构建语法树,写出语法树的短语,简单短语和句柄

写在最前 本文为编译原理重点考察大题之一,理论基础见专栏文章,0基础直接使用也可食用 文章目录 推导构造语法树1.语法树的概念2. 子树,短语,简单短语,句柄2.1 子树2.2 短语2.3 简单短语与句柄2.4 真题实战 推导构造语…

Discourse OpenAI 生成图片

正如一些讨论的,生成图片是比较贵的。 差不多到了 1 元 一张图了。 就 OpenAI 生成了上面 4 张图,费用 0.4 美元。 Discourse OpenAI 生成图片 - Discourse - iSharkFly

AI 开发平台(Coze)搭建《AI女友(多功能版本)》

前言 本文讲解如何从零开始,使用扣子平台去搭建《AI女友(多功能版本)》 bot直达:AI女友(多功能版) - 扣子 AI Bot (coze.cn) 欢迎大家前去体验!!! 正文 功能介绍 …

分别使用netty和apache.plc4x测试读取modbus协议的设备信号

记录一下常见的工业协议数据读取方法 目录 前言Modbus协议说明Netty 读取测试使用plc4x 读取测试结束语 前言 Modbus 是一种通讯协议,用于在工业控制系统中进行数据通信和控制。Modbus 协议主要分为两种常用的变体:Modbus RTU 和 Modbus TCP/IP Modbus …

平面点云格网过程及可视化介绍(python)

1、背景介绍 实际人工构造物中,很多物体表面为平面结构,因此将点云投影在二维平面上进行处理,如进行点云面积计算、点云边缘提取等。 具体案例可以参考博客:详解基于格网法统计平面点云面积_点云格网法计算xy投影面积-CSDN博客、点…

分页处理封装+分页查询题目列表

文章目录 1.sun-club-common封装分页1.com/sunxiansheng/subject/common/eneity/PageInfo.java2.com/sunxiansheng/subject/common/eneity/PageResult.java 2.sun-club-application-controller1.SubjectInfoDTO.java 继承PageInfo并新增字段2.SubjectController.java 3.sun-clu…

8个Unity开发高手都在用的秘密技巧!

1. 不要重新发明轮子,使用内置的引擎工具 在使用任何引擎时,比如Unity或Unreal Engine,一些开发者,主要是来自计算机科学领域的开发者,可能会倾向于从头开始开发大型算法或结构,而不去了解引擎中是否已经存…

三角洲行动卡顿严重?这样快速解决三角洲行动国服卡顿问题

三角洲行动官方精心设计的游戏地图和敌人布局,加上“曼德尔砖”等目标导向性道具的引入,更是为玩家之间的竞技和争夺增添了无数的变数。每一次的争夺都如同是一场智慧与勇气的较量,让人热血沸腾,无法自拔。在这个战场上&#xff0…

免费可视化工具如何提升工作效率?

免费可视化工具能为我们的工作带来什么好处?在如今数据密集的工作环境中,如何高效地处理和展示数据成为了每个行业的重要任务。传统的工具如Excel虽然强大,但在处理复杂数据和创建高级图表时往往显得力不从心。而免费可视化工具的出现&#x…

Arduino - 光敏传感器

Arduino - Light Sensor Arduino - 光传感器 In this tutorial, we are going to learn: 在本教程中,我们将学习: How light sensor works 光传感器的工作原理How to connect the light sensor to Arduino 如何将光传感器连接到ArduinoHow to progra…

C#udpClient组播

一、0udpClient 控件: button(打开,关闭,发送),textbox,richTextBox 打开UDP: UdpClient udp: namespace _01udpClient {public partial class Form1 : Form{public Form1(){Initi…

如何在Windows 11上设置默认麦克风和相机?这里有详细步骤

如果你的Windows 11计算机上连接了多个麦克风或网络摄像头,并且希望自动使用特定设备,而不必每次都在设置中乱动,则必须将首选设备设置为默认设备。我们将向你展示如何做到这一点。 如何在Windows 11上更改默认麦克风 有两种方法可以将麦克…

[游戏开发][UE5]引擎使用学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1,参数2,参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1:输出窗口归类使用,你写什么它就显示什么 参数2&#x…

网络安全入门必选:十款免费的抓包工具有哪些?

下面给大家推荐几款好用的免费的抓包工具软件,有需要的小伙伴们来了解一下。 1. Wireshark抓包分析工具 4.0.1 Wireshark是一款功能强大的网络协议分析器,可以实时检测和抓取网络通讯数据。它支持多种协议和媒体类型,并具备丰富的显示过滤…

从0-1搭建一个web项目(package.json)详解

本章分析package.json文件详解 本文主要对packge.json配置子文件详解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等…

干货:ANR日志分析全面解析

ANR类型 出现ANR的一般有以下几种类型: 1:KeyDispatchTimeout(常见) input事件在5S内没有处理完成发生了ANR。 logcat日志关键字:Input event dispatching timed out 2:BroadcastTimeout 前台Broadcast:onReceiver在…

MYSQL 四、mysql进阶 5(InnoDB数据存储结构)

一、数据库的存储结构:页 索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说时存储在页结构中,另一方面,索引是在存储引擎中实现的,Mysql服务器上的存储引擎负责对表…

eNSP中VRRP的配置和使用

一、基础配置 1.新建拓扑图 2.配置vlan a.CORE-S1 <Huawei>system-view [Huawei]sysname CORE-S1 [CORE-S1]vlan 10 [CORE-S1-vlan10]vlan 20 [CORE-S1-vlan20]vlan 30 b.CORE-S2 <Huawei>system-view [Huawei]sysname CORE-S2 [CORE-S2]vlan 10 [CORE…