本文共 2964 字,大约阅读时间需要 9 分钟。
好久没更新设计模式系列的文章了,最近工作有些变动,无论如何都不能停止学习。在产品中发挥更大的价值。设计模式一直是我非常重视的一块内容,如果说数据结构算法是编程的内功,那设计模式就是架构师的内功。
中介者模式是行为模式的一种,它主要是封装了通信的关心的复杂性,如果很多同事之间都有消息的传递。这个时候如果再增加新的同事,那通信开销会成倍增加。// 中介者 static class Mediator { // 控制请求 private void print(AbstractUser sourceUser, AbstractUser targetUser) { System.out.println("中介者收到 " + sourceUser.getName() + " 请求"); // 调用目标对象 System.out.println(targetUser.getName() + " --- actions : "); targetUser.actions(); } }
static abstract class AbstractUser { protected String name; // 所有用户都能够跟中介者通信 protected Mediator mediator; AbstractUser (Mediator mediator) { this.mediator = mediator; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 定义通信 public void sendHelp(AbstractUser abstractUser) { System.out.println(this.getName() + " 发送消息给中介者 : "); this.mediator.print(this, abstractUser); } // 每个User public abstract void actions(); }
static class ASystemUser extends AbstractUser { ASystemUser(Mediator mediator) { super(mediator); } @Override public void actions() { System.out.println("ASystem take actions"); } } static class BSystemUser extends AbstractUser { BSystemUser(Mediator mediator) { super(mediator); } @Override public void actions() { System.out.println("BSystem take actions"); } }
测试代码:
Mediator mediator = new Mediator(); AbstractUser user1 = new ASystemUser(mediator); user1.setName("用户A"); AbstractUser user2 = new BSystemUser(mediator); user2.setName("用户B"); user1.sendHelp(user2); System.out.println("-----------"); user2.sendHelp(user1);
用户A 发送消息给中介者 : 中介者收到 用户A 请求用户B --- actions : BSystem take actions-----------用户B 发送消息给中介者 : 中介者收到 用户B 请求用户A --- actions : ASystem take actions
如果我们要添加一个新的关系
static class CSystemUser extends AbstractUser { CSystemUser(Mediator mediator) { super(mediator); } @Override public void actions() { System.out.println("我是新的用户C"); } }
AbstractUser user3 = new CSystemUser(mediator); user3.setName("用户3"); user2.sendHelp(user3);
用户A 发送消息给中介者 : 中介者收到 用户A 请求用户B --- actions : BSystem take actions-----------用户B 发送消息给中介者 : 中介者收到 用户B 请求用户A --- actions : ASystem take actions---------用户B 发送消息给中介者 : 中介者收到 用户B 请求用户3 --- actions : 我是新的用户C
不用修改原有的代码,这样就方便了扩展,优点是降低了耦合。缺点也是中介类过重的责任。应该根据场景使用该模式。这里的UML与我的例子不同的是,UML中Media是抽象类或者接口。可以根据需要去注入具体的中介者实现类,怎样去调用之间的关系完全取决于中介者的具体实现,这里我用一个类代替了接口。