【设计模式】行为型模式(四):备忘录模式、中介者模式

news2024/11/17 18:19:58

设计模式之行为型模式》系列,共包含以下文章:

  • 行为型模式(一):模板方法模式、观察者模式
  • 行为型模式(二):策略模式、命令模式
  • 行为型模式(三):责任链模式、状态模式
  • 行为型模式(四):备忘录模式、中介者模式
  • 行为型模式(五):解释器模式、访问者模式、依赖注入

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

行为型模式(四):备忘录模式、中介者模式

  • 7.备忘录模式(Memento)
    • 7.1 通俗易懂的解释
    • 7.2 具体步骤
    • 7.3 代码示例
      • 7.3.1 定义发起人
      • 7.3.2 定义备忘录
      • 7.3.3 定义管理者
      • 7.3.4 客户端
      • 7.3.5 输出
    • 7.4 总结
  • 8.中介者模式(Mediator)
    • 8.1 通俗易懂的解释
    • 8.2 具体步骤
    • 8.3 代码示例
      • 8.3.1 定义中介者接口
      • 8.3.2 定义同事类
      • 8.3.3 具体同事类
      • 8.3.4 具体中介者类
      • 8.3.5 客户端
      • 8.3.6 输出
    • 8.4 总结

7.备忘录模式(Memento)

备忘录模式Memento)是一种行为设计模式,它允许你在不破坏封装性的前提下,捕获一个对象的内部状态,并在之后恢复为之前的状态。简单来说,就是保存一个对象的 快照,以便将来可以恢复到这个状态。
在这里插入图片描述

7.1 通俗易懂的解释

想象一下你正在玩一个电子游戏,游戏中有一个 “存档” 功能。当你存档时,游戏会保存你当前的所有状态(比如角色的位置、生命值、装备等)。当你需要时,可以加载这个存档,恢复到之前的状态。这就是备忘录模式的基本思想。

7.2 具体步骤

  • 定义发起人:发起人是需要保存和恢复状态的对象。
  • 定义备忘录:备忘录是一个用于存储发起人状态的类。
  • 定义管理者:管理者是一个用于保存和管理备忘录的类。
  • 保存状态:发起人将当前状态保存到备忘录中,并将备忘录交给管理者。
  • 恢复状态:发起人从管理者那里获取备忘录,并恢复到之前的状态。

7.3 代码示例

下面是一个简单的 Java 代码示例,展示了备忘录模式的实现。

7.3.1 定义发起人

// 定义发起人
class Originator {
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    // 创建备忘录
    public Memento createMemento() {
        return new Memento(state);
    }

    // 恢复备忘录
    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }

    @Override
    public String toString() {
        return "Originator [state=" + state + "]";
    }
}

7.3.2 定义备忘录

// 定义备忘录
class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

7.3.3 定义管理者

// 定义管理者
class Caretaker {
    private Memento memento;

    public void setMemento(Memento memento) {
        this.memento = memento;
    }

    public Memento getMemento() {
        return memento;
    }
}

7.3.4 客户端

// 测试类
public class MementoPatternExample {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        // 设置初始状态
        originator.setState("状态1");
        System.out.println("初始状态: " + originator);

        // 保存状态
        caretaker.setMemento(originator.createMemento());

        // 改变状态
        originator.setState("状态2");
        System.out.println("改变后的状态: " + originator);

        // 恢复状态
        originator.restoreMemento(caretaker.getMemento());
        System.out.println("恢复后的状态: " + originator);
    }
}

7.3.5 输出

初始状态: Originator [state=状态1]
改变后的状态: Originator [state=状态2]
恢复后的状态: Originator [state=状态1]

7.4 总结

备忘录模式通过将对象的状态保存到一个独立的备忘录对象中,使得对象可以在需要时恢复到之前的状态。这样可以避免在对象内部直接暴露状态,保持了对象的封装性。

8.中介者模式(Mediator)

中介者模式Mediator)是一种行为设计模式,它通过一个中介对象来封装一系列对象之间的交互,使得这些对象不再直接相互依赖,而是通过中介者进行通信。这样可以减少对象之间的耦合,使系统的结构更加清晰和易于维护。

在这里插入图片描述

8.1 通俗易懂的解释

想象一下你在一个大型的办公室里,有很多员工需要互相沟通。如果每个员工都直接和其他员工沟通,那么沟通的复杂度会非常高,很容易出现混乱。为了解决这个问题,可以设置一个前台秘书,所有的沟通都通过前台秘书进行。员工只需要告诉秘书他们的需求,秘书会负责协调和传达信息。这样,员工之间的沟通就变得简单和有序了。

8.2 具体步骤

  • 定义中介者接口:定义一个中介者接口,声明协调对象之间交互的方法。
  • 实现具体中介者:实现具体的中介者类,负责协调对象之间的交互。
  • 定义同事类:定义需要通过中介者进行通信的对象类,这些对象称为同事类。
  • 注册同事类:同事类在创建时需要注册到中介者中。
  • 通过中介者通信:同事类之间的通信都通过中介者进行,而不是直接相互依赖。

8.3 代码示例

下面是一个简单的 Java 代码示例,展示了中介者模式的实现。

8.3.1 定义中介者接口

// 定义中介者接口
interface Mediator {
    void send(String message, Colleague colleague);
}

8.3.2 定义同事类

// 定义同事类
abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

8.3.3 具体同事类

// 具体同事类:员工A
class ColleagueA extends Colleague {
    public ColleagueA(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("员工A收到消息: " + message);
    }
}

// 具体同事类:员工B
class ColleagueB extends Colleague {
    public ColleagueB(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("员工B收到消息: " + message);
    }
}

8.3.4 具体中介者类

// 具体中介者类:前台秘书
class SecretaryMediator implements Mediator {
    private ColleagueA colleagueA;
    private ColleagueB colleagueB;

    public void setColleagueA(ColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public void setColleagueB(ColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }

    @Override
    public void send(String message, Colleague colleague) {
        if (colleague == colleagueA) {
            colleagueB.receive(message);
        } else if (colleague == colleagueB) {
            colleagueA.receive(message);
        }
    }
}

8.3.5 客户端

// 测试类
public class MediatorPatternExample {
    public static void main(String[] args) {
        SecretaryMediator mediator = new SecretaryMediator();

        ColleagueA colleagueA = new ColleagueA(mediator);
        ColleagueB colleagueB = new ColleagueB(mediator);

        mediator.setColleagueA(colleagueA);
        mediator.setColleagueB(colleagueB);

        // 员工A发送消息
        colleagueA.send("你好,员工B,项目进展如何?");

        // 员工B发送消息
        colleagueB.send("你好,员工A,项目进展顺利。");
    }
}

8.3.6 输出

员工B收到消息: 你好,员工B,项目进展如何?
员工A收到消息: 你好,员工A,项目进展顺利。

8.4 总结

中介者模式通过引入一个中介者对象,将多个对象之间的直接依赖关系解耦,使得对象之间的通信更加有序和简单。这样可以减少对象之间的耦合,提高系统的可维护性和扩展性。

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

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

相关文章

GRE做题笔记(零散的个人经验)

locomotive机车By 1813, the Luddite resistance had all but vanished. all but表示“几乎完全”的程度,或者表示排除piston活塞attributed to 归因于how a sportsperson accounted for their own experience of stress 运动员如何解释自己的压力经历 ,…

【vmware+ubuntu16.04】vm虚拟机及镜像安装-tools安装包弹不出来问题

学习机器人这门课需要下载虚拟机,做一下记录 首先我下载的是vm虚拟机16, 下载版本可参考该文章课堂上我下载 的镜像是16.04,虚拟机安装教程和镜像添加可参考该博主 按照教程安装成功 安装tools,但是我的弹不出来那个压缩包&…

Redis设计与实现 学习笔记 第十七章 集群

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding,水平切分)来进行数据共享,并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点(node)组成,在刚开…

第03章 文件编程

目标 了解Linux系统文件IO/标准IO基本概念掌握Linux系统文件IO/标准IO常用函数掌握Linux系统文件属性常用函数掌握Linux系统目录文件常用函数 3.1 Linux系统概述 3.1.1 预备知识(相关概念) (1)应用程序 和 内核程序 应用程序是…

51c大模型~合集42

我自己的原文哦~ https://blog.51cto.com/whaosoft/11859244 #猎户座 「草莓」即将上线,OpenAI新旗舰大模型曝光,代号「猎户座」 ChatGPT 要进化了? 本月初,OpenAI 创始人、CEO 山姆・奥特曼突然在 X 上发了一张照片&#xff0…

SpringBootTest常见错误解决

1.启动类所在包错误 问题 由于启动类所在包与需要自动注入的类的包不在一个包下: 启动类所在包: com.exmaple.test_02 但是对于需要注入的类却不在com.exmaple.test_02下或者其子包下,就会导致启动类无法扫描到该类,从而无法对…

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中,我们了解了基础的网络知识,网络的出…

机器学习 AdaBoost 算法

AdaBoost 提升学习算法是通过训练多个弱分类算法实现一个强分类算法,做法非常朴素,在训练过程中,提供分类错误的数据权重,降低分类正确的权重,提高分类效果好的弱分类器权重,降低分类效果差的若分类器权重。…

C++编程技巧与规范-类和对象

类和对象 1. 静态对象的探讨与全局对象的构造顺序 静态对象的探讨 类中的静态成员变量(类类型静态成员) 类中静态变量的声明与定义&#xff08;类中声明类外定义&#xff09; #include<iostream> using namespace std;namespace _nmspl {class A{public:A():m_i(5){…

golang中的init函数

程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包&#xff0c;那么就会在编译时将它们依次 导入。有时一个包会被多个包同时导入&#xff0c;那么它只会被导入一次&#xff08;例如很多包可能都会用到 fmt 包&#xff0c;但 它只会被导入一次&#x…

【大数据学习 | flume】flume之常见的sink组件

Flume Sink取出Channel中的数据&#xff0c;进行相应的存储文件系统&#xff0c;数据库&#xff0c;或者提交到远程服务器。Flume也提供了各种sink的实现&#xff0c;包括HDFS sink、Logger sink、Avro sink、File Roll sink、HBase sink&#xff0c;。 ​ Flume Sink在设置存…

数学分组求偶数和

问题描述 小M面对一组从 1 到 9 的数字&#xff0c;这些数字被分成多个小组&#xff0c;并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。 numbers: 一个由多个整数字符串组…

构建安全护盾:HarmonyOS 应用的数据安全审计与日志管理实战

文章目录 前言数据安全审计与日志管理的重要性什么是数据安全审计&#xff1f;为什么需要日志管理&#xff1f; 数据安全审计与日志管理的基本原则实现数据安全审计与日志管理的技术方案1. 数据安全审计的实现2. 日志管理的实现 ArkUI 与 ArkTS 的代码示例1. 审计日志记录2. 实…

ReactPress与WordPress:两大开源发布平台的对比与选择

ReactPress与WordPress&#xff1a;两大开源发布平台的对比与选择 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。两款备受欢迎的开源发布平台——ReactPress和WordPress&#xff0c;各自拥有独特的优势和特点&am…

HarmonyOS 开发环境搭建

HarmonyOS&#xff08;鸿蒙操作系统&#xff09;作为一种面向全场景多设备的智能操作系统&#xff0c;正逐渐在市场上崭露头角。为了进入HarmonyOS生态&#xff0c;开发者需要搭建一个高效的开发环境。本文将详细介绍如何搭建HarmonyOS开发环境&#xff0c;特别是如何安装和配置…

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

【提高篇】3.3 GPIO(三,工作模式详解 上)

目录 一,工作模式介绍 二,输入浮空 2.1 输入浮空简介 2.2 输入浮空特点 2.3 按键检测示例 2.4 高阻态 三,输入上拉 3.1 输入上拉简介 3.2 输入上拉的特点 3.3 按键检测示例 四,输入下拉 4.1 输入下拉简介 4.2 输入下拉特点 4.3 按键检测示例 一,工作模式介绍…

微服务瞎写

1.微服务解决的问题 1、如何发现新节点以及检查各节点的运行状态&#xff1f; 2、如何发现服务及负载均衡如何实现&#xff1f; 3、服务间如何进行消息通信&#xff1f; 4、如何对使用者暴露服务API&#xff1f; 5、如何集中管理各节点配置文件&#xff1f; 6、如何收集各…

Python Tornado框架教程:高性能Web框架的全面解析

Python Tornado框架教程&#xff1a;高性能Web框架的全面解析 引言 在现代Web开发中&#xff0c;选择合适的框架至关重要。Python的Tornado框架因其高性能和非阻塞I/O特性而备受青睐。它特别适合处理大量并发连接的应用&#xff0c;比如聊天应用、实时数据处理和WebSocket服务…

基于图像分类的对抗攻击算法研究

图像分类与对抗攻击 图像分类是计算机视觉的基础任务&#xff0c;旨在 将不同类别的图像准确归类 。随着深度学习发展&#xff0c;模型在大规模数据集上的表现已超越人类。然而&#xff0c;这一进步也引发了新的安全挑战—— 对抗攻击 。 对抗攻击通过向原始图像添加精心设计的…