前言
目前正在出一个设计模式专题
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的中介者模式
,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以Java
语言为主, 好了, 废话不多说直接开整吧~
中介者模式
中介者模式
是一种行为型设计模式,其目的是将对象间的相互作用解耦
,使得各个对象间的通信只通过中介者进行,从而避免对象之间直接相互依赖,提高代码的可维护性和扩展性。
在中介者模式
中,中介者负责协调各个对象间的通信和行为,同时它也包含了这些对象的引用,这些对象则通过中介者进行通信。这种模式通常应用于一个系统中对象之间的相互作用非常复杂,难以维护和扩展的情况。
interface Mediator { void sendMessage(String message, Colleague colleague); } // 定义抽象同事类 abstract class Colleague { private Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } public void sendMessage(String message) { mediator.sendMessage(message, this); } public Mediator getMediator() { return mediator; } public abstract void receiveMessage(String message); } // 实现具体同事类 class ConcreteColleague1 extends Colleague { public ConcreteColleague1(Mediator mediator) { super(mediator); } @Override public void receiveMessage(String message) { System.out.println("ConcreteColleague1 接收到消息:" + message); } } // 实现具体同事类 class ConcreteColleague2 extends Colleague { public ConcreteColleague2(Mediator mediator) { super(mediator); } @Override public void receiveMessage(String message) { System.out.println("ConcreteColleague2 接收到消息:" + message); } } // 实现具体中介者类 class ConcreteMediator implements Mediator { private ConcreteColleague1 colleague1; private ConcreteColleague2 colleague2; public void setColleague1(ConcreteColleague1 colleague1) { this.colleague1 = colleague1; } public void setColleague2(ConcreteColleague2 colleague2) { this.colleague2 = colleague2; } @Override public void sendMessage(String message, Colleague colleague) { if (colleague == colleague1) { colleague2.receiveMessage(message); } else if (colleague == colleague2) { colleague1.receiveMessage(message); } } } // 测试代码 public class MediatorPatternDemo { public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator(); ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator); ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator); mediator.setColleague1(colleague1); mediator.setColleague2(colleague2); colleague1.sendMessage("Hello, colleague2!"); colleague2.sendMessage("Hello, colleague1!"); } }
输出
ConcreteColleague2 接收到消息:Hello, colleague2! ConcreteColleague1 接收到消息:Hello, colleague1!
通过中介者
模式,所有同事类都通过中介者对象来发送和接收消息,而不需要直接相互联系,从而实现松耦合的效果。
最佳实践
在电商平台业务中,可以使用中介者模式来实现订单处理功能。中介者模式可以帮助不同对象之间进行通信,而不需要它们直接相互引用
public interface Mediator { void placeOrder(Order order); void cancelOrder(Order order); } // 定义具体中介者 public class OrderMediator implements Mediator { private List<Order> orders = new ArrayList<>(); @Override public void placeOrder(Order order) { orders.add(order); System.out.println("New order placed: " + order.getOrderId()); } @Override public void cancelOrder(Order order) { orders.remove(order); System.out.println("Cancelled order: " + order.getOrderId()); } } // 定义抽象同事类 public abstract class Order { protected Mediator mediator; protected String orderId; public Order(Mediator mediator, String orderId) { this.mediator = mediator; this.orderId = orderId; } public String getOrderId() { return orderId; } public abstract void place(); public abstract void cancel(); } // 定义具体同事类 public class PurchaseOrder extends Order { public PurchaseOrder(Mediator mediator, String orderId) { super(mediator, orderId); } @Override public void place() { mediator.placeOrder(this); } @Override public void cancel() { mediator.cancelOrder(this); } } // 使用中介者模式 public class Main { public static void main(String[] args) { Mediator mediator = new OrderMediator(); Order order = new PurchaseOrder(mediator, "PO12345"); order.place(); order.cancel(); } }
在上面的示例中,中介者模式
代表了订单处理系统。PurchaseOrder
和CancelOrder
是它的具体子类。
在Main
类中,我们创建了一个OrderMediator
实例,并将其传递给PurchaseOrder
实例。当我们调用place()
和cancel()
方法时,实际发生的是与中介者对象的通信,而不是直接与其他订单对象通信。
这种设计可以使订单处理系统更加灵活,易于扩展和维护。
结束语
设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲备忘录模式
~
本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注
鼓励一下呗~
相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
- 利用docker搭建es集群
- 一起来学ElasticSearch(一)
- 一起来学ElasticSearch(二)
- 一起来学ElasticSearch(三)
- 一起来学ElasticSearch(四)
- 一起来学ElasticSearch(五)
- 一起来学ElasticSearch(六)
- 一起来学ElasticSearch(七)
- 一起来学ElasticSearch(八)
- 一起来学ElasticSearch(九)
- 一起来学ElasticSearch(十)
- 一起来学ElasticSearch之整合SpringBoot(一)
- 一起来学ElasticSearch之整合SpringBoot(二)
- 一起来学ElasticSearch之整合SpringBoot(三)
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
- springboot-all
地址
: github.com/qiuChenglei…- SpringBoot系列教程合集
- 一起来学SpringCloud合集
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(二)