浅谈Java23种设计模式之11种行为型模式的使用场景(第二部分)

前言:
行为型设计模式实际使用场景第二部分;

1.中介者模式(Mediator)

概念:

它定义了一个中介类来封装一系列对象之间的交互,从而使各个对象不需要显式地相互引用,降低耦合度,提高系统的可维护性和扩展性。中介者模式让多个对象通过一个中介对象来通信,而不是互相引用。

实际使用场景:

设想一个聊天室应用,其中包含多个用户。用户之间可以通过聊天室发送消息,但为了简化管理,我们不希望每个用户直接与其他用户建立连接,而是通过一个聊天室中介者来协调消息的传递。这样,新增或移除用户时,只需要更改中介者,而不用修改每个用户类。

直接上代码:

a.抽象中介者

public interface ChatRoomMediator {void sendMessage(String message, User user);
}

b.具体中介者

public class ChatRoom implements ChatRoomMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void sendMessage(String message, User user) {for (User u : users) {if (!u.equals(user)) {u.receive(message);}}}public void addUser(User user) {users.add(user);user.setChatRoom(this);}
}

c.抽象同事类

public abstract class User {protected String name;protected ChatRoomMediator chatRoom;public User(String name) {this.name = name;}public abstract void receive(String message);public void setChatRoom(ChatRoomMediator chatRoom) {this.chatRoom = chatRoom;}
}

d.具体同事类

public class UserImpl extends User {public UserImpl(String name) {super(name);}@Overridepublic void receive(String message) {System.out.println(name + " received: " + message);}public void sendMessage(String message) {chatRoom.sendMessage(message, this);}
}

e.客户端代码

public class MediatorPatternDemo {public static void main(String[] args) {ChatRoom chatRoom = new ChatRoom();UserImpl user1 = new UserImpl("Alice");UserImpl user2 = new UserImpl("Bob");chatRoom.addUser(user1);chatRoom.addUser(user2);user1.sendMessage("Hello, Bob!");user2.sendMessage("Hi, Alice!");}
}

解释
在这个例子中,ChatRoom类作为中介者,管理用户间的通信。UserImpl类作为具体同事类,它们不知道其他用户的直接引用,而是通过调用中介者(聊天室)的方法来发送消息。这样,即使添加或删除用户,也只需要修改中介者的状态,而无需修改用户类,大大降低了耦合度,体现了中介者模式的优点。

2.备忘录模式(Memento)

概念:

它提供了一种在不破坏封装性的前提下,捕获一个对象的内部状态,并在将来恢复该对象状态的方法。这个模式非常适合需要实现撤销操作的场景,比如文本编辑器的撤销功能、游戏的存档与读档功能等。

实际使用场景:

假设我们正在开发一个文本编辑器应用,用户在编辑文本时可能会希望保存当前的编辑状态,以便在未来某个时刻可以恢复到这一状态。这里,我们可以使用备忘录模式来设计文本编辑器的状态保存与恢复功能。

直接上代码:

a.备忘录类(Memento)

public class EditorMemento {private String content;public EditorMemento(String content) {this.content = content;}public String getContent() {return content;}
}

b.原发器类(Originator)

public class TextEditor {private String content;public void type(String text) {content += text;System.out.println("Typed: " + text);}public EditorMemento save() {return new EditorMemento(content);}public void restore(EditorMemento memento) {content = memento.getContent();System.out.println("Restored content: " + content);}
}

c.客户端代码

public class MementoPatternDemo {public static void main(String[] args) {TextEditor editor = new TextEditor();// 编辑文本editor.type("Hello, ");editor.type("World!");// 保存当前状态EditorMemento savedState = editor.save();// 继续编辑editor.type(" How are you?");// 恢复到保存的状态editor.restore(savedState);}
}

解释
在这个例子中,TextEditor类是原发器,它负责创建和恢复文本的状态。EditorMemento类是备忘录,存储了文本编辑器的内部状态(即文本内容)。客户端代码模拟了用户编辑文本、保存状态以及恢复到之前保存状态的过程。备忘录模式允许我们在不影响原发器类设计的情况下,保存和恢复对象的状态,这对于需要实现撤销/重做功能的应用来说非常有用。

3.观察者模式(Observer)

概念:

它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件处理系统、实时数据更新等场景。

实际使用场景:

假设我们正在开发一个天气预报系统,用户可以订阅不同的城市天气预报。当某个城市的天气发生变化时,系统需要即时通知所有订阅该城市天气预报的用户。这是一个典型的观察者模式应用场景。

直接上代码:

a.抽象主题(Subject)

public interface WeatherSubject {void registerObserver(WeatherObserver observer);void removeObserver(WeatherObserver observer);void notifyObservers(String city, String weather);
}

b.具体主题(Concrete Subject)

import java.util.ArrayList;
import java.util.List;public class WeatherDataCenter implements WeatherSubject {private List<WeatherObserver> observers;private String currentCity;private String currentWeather;public WeatherDataCenter() {this.observers = new ArrayList<>();}@Overridepublic void registerObserver(WeatherObserver observer) {observers.add(observer);}@Overridepublic void removeObserver(WeatherObserver observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String city, String weather) {currentCity = city;currentWeather = weather;for (WeatherObserver observer : observers) {observer.update(city, weather);}}public void setWeather(String city, String weather) {System.out.println("Weather update: " + city + ", " + weather);notifyObservers(city, weather);}
}

c.抽象观察者(Observer)

public interface WeatherObserver {void update(String city, String weather);
}

d.具体观察者(Concrete Observer)

public class User implements WeatherObserver {private String name;private String subscribedCity;public User(String name, String subscribedCity) {this.name = name;this.subscribedCity = subscribedCity;}@Overridepublic void update(String city, String weather) {if (this.subscribedCity.equals(city)) {System.out.println(name + " received update: " + city + " weather is " + weather);}}
}

e.客户端代码

public class ObserverPatternDemo {public static void main(String[] args) {WeatherSubject weatherDataCenter = new WeatherDataCenter();WeatherObserver user1 = new User("Alice", "New York");WeatherObserver user2 = new User("Bob", "San Francisco");weatherDataCenter.registerObserver(user1);weatherDataCenter.registerObserver(user2);weatherDataCenter.setWeather("New York", "Sunny");weatherDataCenter.setWeather("San Francisco", "Foggy");}
}

解释
在这个例子中,WeatherDataCenter作为被观察的主题,维护了一个观察者列表,并负责在天气信息更新时通知所有观察者。User类作为观察者,实现了WeatherObserver接口,当接收到更新通知时,会检查是否是自己订阅的城市,如果是,则打印出更新信息。这样,当天气数据发生变化时,所有订阅该天气信息的用户都能及时得到通知,而无需知道具体的用户实现细节,实现了低耦合的设计。

好了以上就是行为型设计模式的3种具体设计模式的使用场景;第三部分下期见.

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

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

相关文章

滑动窗口练习1-长度最小的子数组

1.题目链接&#xff1a;209.长度最小的子数组 2.题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条…

聊聊分布式集群的基本概念

在当前主流的分布式架构中,各种各样的集群技术几乎成了任何想要提升系统稳定性和处理能力的团队的必备技能。虽然各种中间件和系统都有让人看似眼花缭乱的集群实现方案,但其背后仍然逃不过一些核心的技术概念,我会结合几个我比较熟悉的中间件,简单聊一下我对集群的理解: …

zlib安装教程(Windows)

开源项目地址&#xff1a;madler/zlib: A massively spiffy yet delicately unobtrusive compression library. (github.com) 下载代码 可以选择git clone 或直接下载release包 Releases madler/zlib (github.com) git clone https://github.com/madler/zlib.git release…

【Android面试八股文】Kotlin内置标准函数with的原理是什么?

文章目录 原理和实现方式应用场景总结 with 是 Kotlin 标准库中的一个内置函数&#xff0c;其主要目的是简化对某个对象实例执行多个操作的代码。它的原理和实现方式如下&#xff1a; 原理和实现方式 with的源码定义如下&#xff1a; /*** Calls the specified function [blo…

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

引言&#xff1a;在使用 MyBatis 进行数据库操作时&#xff0c;#{} 和 ${} 的区别是面试中常见的问题&#xff0c;对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性&#xff0c;还涉及到性能优化。 题目 被拷打已老实&…

GRU基础知识以及相关名词解释

当然&#xff0c;GRU&#xff08;Gated Recurrent Unit&#xff0c;门控循环单元&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;结构&#xff0c;它引入了门控机制来更好地控制信息的流动&#xff0c;从而解决了传统RNN在处理长序列数据时存在的梯度消失和梯…

2024-06-19,面试官问的问题

文章目录 1、采用minIO完成了图片存储&#xff0c;采用阿里云OSS服务器存储图片这两个功能面试官理解为重复&#xff0c;面试官又问minIO怎么同步到OSS&#xff1f;2、讲一下ThreadLocal&#xff1f;3、为什么用ThreadLocal存数据&#xff1f;4、redis有几种数据结构&#xff1…

零成本!无需服务器,搭建你的图床!

先给大家看看成品&#xff1a; 访问地址&#xff1a;http://cp64mba5g6h48vl4is50.app.memfiredb.cn/ 这是我花十分钟做出来的零成本&#xff0c;不需要服务器的图床&#xff0c;不需要登录&#xff0c;任何人都可以在上面上传图片和拿到图片链接去使用&#xff0c;当然这只…

【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程&#xff08;类的生命周期&#xff09;3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…

大数据的发展,带动电子商务产业链,促进了社会的进步【电商数据采集API接口推动电商项目的源动力】

最近几年计算机技术在诸多领域得到了有效的应用&#xff0c;同时在多方面深刻影响着我国经济水平的发展。除此之外&#xff0c;人民群众的日常生活水平也受大数据技术的影响。 在这其中电子商务领域也在大数据技术的支持下&#xff0c;得到了明显的进步。虽然电子商务领域的发…

网页钓鱼-克隆修改--劫持口令下载后门

免责声明:本文仅做技术交流与学习... 目录 1-右键另存为 2-goblin项目(不推荐) 修改goblin.yaml文件 运行exe ​编辑 3-Setoolkit (kali自带) 网页克隆---> 1-右键另存为 --不行就再定位元素进行修改. 2-goblin项目(不推荐) GitHub - xiecat/goblin: 一款适用于红蓝…

Spring Boot 增删改查(mybatis-plus)

在GitHub上已经开源&#xff0c;有全部源码&#xff0c;有问题可以在GitHub上提问https://github.com/sky41/MySQL.git 1、创建(User) 实体类 package com.my.mysql.entity; import lombok.*; Setter Getter Data NoArgsConstructor //AllArgsConstructor public …

云原生安全联防联抗策略玩转微隔离

前言 随着信息技术的发展、互联网的快速普及&#xff0c;越来越多的信息被存储在云端&#xff0c;企业面临的安全问题也日益突出。在《网络安全法》、《数据安全法》等多部法律法规要求下&#xff0c;各行业用户纷纷设立安全部门。不管安全部门里是“一人当关”还是“三三两两…

PCB AVI品质报告采集工具

AVI设备,品质报告. 可以通过: 过滤文件名指定文件名 排除多余的日志;运行日志为增量日志,可采用增量模式;品质报告可设置采集后删除; 下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自…

lammps聚合物建模组合技巧

大家好,我是小马老师。 本文介绍聚合物结构的组合问题。 在lammps模拟中,聚合物模拟应该算是比较复杂的一种模拟,不仅建模复杂、势参数较多,而且在模拟过程中也会经常出现各种意想不到的错误。 本文主要解决聚合物建模过程中常遇到的一个问题:多成分的组合。 比如下面的结…

什么是分布式架构?

一、分布式架构的概念&#xff1a; 分布式架构是现代软件工程中一个非常核心的概念&#xff0c;特别是在互联网、大数据和云计算领域。分布式架构指的是将一个应用程序分解为多个相互协作的组件或服务&#xff0c;这些组件或服务运行在不同的计算机或服务器上&#xff0c;通常…

【仿真建模-anylogic】Port原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-14 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数&#xff1a; Port作为各类型端口的基类&#xff0c;其核心方法如下 &#xff1a; 函数功能Port(A…

Linux磁盘格式化与重新分区

1.df -BG查看磁盘挂载情况 2.fdisk -l查看磁盘详细信息 3.sudo mkfs.ext4 /path 格式化磁盘 4.挂载格式化后磁盘 挂载成功

CPU 和主板芯片组对应关系

英特尔各代CPU 对应主板芯片组列表 1. 第一代Core&#xff08;Nehalem架构&#xff0c;2008年&#xff09; Core i7/i5/i3&#xff08;LGA 1366/1156&#xff09; 芯片组&#xff1a;X58&#xff08;LGA 1366&#xff09;、P55、H55、H57&#xff08;LGA 1156&#xff09; …

初见DP

线性DP 例题1 1143. 最长公共子序列 &#xff08;LCS&#xff09; 子序列不连续 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#x…