前言
目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的中介者模式,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以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 专题学习
项目源码(源码已更新 欢迎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并行流有了解过吗?说说看