当前位置: 首页 > article >正文

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

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

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

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

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

  • 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.kler.cn/a/402437.html

相关文章:

  • 洛谷 B3635 硬币问题 C语言 记忆化搜索
  • TensorFlow如何调用GPU?
  • 【MySQL】数据库核心技术与应用指南
  • Otter 安装流程
  • SCAU软件体系结构实验四 组合模式
  • C#构建一个简单的前馈神经网络
  • javaweb学习——Day2
  • 原生鸿蒙中实现RN热加载的详细步骤
  • gin源码阅读(2)请求体中的JSON参数是如何解析的?
  • 科技赋能-JAVA发票查验接口、智能、高效的代名词
  • 【springboot】配置文件加载顺序
  • 「四」体验HarmonyOS端云一体化开发模板——工程目录结构与云侧工程一键部署AGC云端
  • 【D01】网络安全概论
  • mySql修改时区完整教程
  • 实战精选|如何使用 OpenVINO™ 在 ElectronJS 中创建桌面应用程序
  • Stable Diffusion核心网络结构——CLIP Text Encoder
  • 修改gitee提交时用户名密码输错导致提交失败的解决方法
  • 第14章 Nginx WEB服务器企业实战
  • 详细描述一下Elasticsearch搜索的过程?
  • 计算机网络安全 —— 对称加密算法 DES (一)
  • Linux TCP 服务器实现双向通信1v1
  • 【系统架构设计师】真题论文: 论企业应用系统的数据持久层架构设计(包括解题思路和素材)
  • Go小记:使用Go实现ssh客户端
  • Golang超详细入门教程
  • android 性能分析工具(04)Asan 内存检测工具
  • ROS2 Humble 机器人建模和Gazebo仿真