【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】
知识回顾:
之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)—行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)—行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)—行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)—行为型模式】
【Java中23种面试常考的设计模式之策略模式(Strategy)—行为型模式】
【Java中23种面试常考的设计模式之迭代器模式(Iterator)—行为型模式】
【Java中23种面试常考的设计模式之访问者模式(Visitor)—行为型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】。
中介者模式
中介者模式:用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
解决的问题
- 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂。
- 因为对象之前存在着复杂的关系,牵一发而动全身,所以我们需要抽离出来一个中介者类来对其它类进行灵活的调节。
- 如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为"同事对象",我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为星型结构。
生产开发中常用的使用场景
- MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
中介者模式优点与缺点
优点
- 降低了类的复杂度,将一对多转化成了一对一。
- 各个类之间的解耦。
- 符合迪米特原则。
缺点
- 中介者会庞大,变得复杂难以维护。
核心角色
Mediator 中介者接口、ConcreteMediator 中介者实现、Colleague同事类接口、ConcreteColleague同事实现类、客户端测试。
UML类图
实现代码
我们实现这样一个栗子:假设A、B、C同事分别负责不同的开发任务,如果没人领导他们,或者说没人给他们分发任务,他们在开发中就会存在一些冲突,这就需要一个中介者(领导者)对他们进行协调。
Mediator 中介者接口
package com.mediator;
public interface Mediator {
void register(String cname,Colleague colleague);
void command(String cname);
}
ConcreteMediator 中介者实现
package com.mediator;
import java.util.HashMap;
import java.util.Map;
public class ConcreteMediator implements Mediator {
private Map<String,Colleague> map = new HashMap<String , Colleague>();
@Override
public void command(String cname) {
map.get(cname).develop();
}
@Override
public void register(String cname, Colleague colleague) {
map.put(cname, colleague);
}
}
Colleague同事类接口
package com.mediator;
public interface Colleague {
void develop(); //做自己负责的功能模块
void report(); //向项目领导者汇报工作
}
ConcreteColleagueA同事实现类
package com.mediator;
public class ConcreteColleagueA implements Colleague {
private Mediator m; //持有中介者的引用
public ConcreteColleagueA(Mediator m) {
super();
this.m = m;
m.register("A", this);
}
@Override
public void report() {
System.out.println("我是A!我要汇报工作!");
m.command("A");
}
@Override
public void develop() {
System.out.println("我是A,我负责前端功能开发!");
}
}
ConcreteColleagueB同事实现类
package com.mediator;
public class ConcreteColleagueB implements Colleague {
private Mediator m; //持有中介者引用
public ConcreteColleagueB(Mediator m) {
super();
this.m = m;
m.register("B", this);
}
@Override
public void report() {
System.out.println("我是B!我要汇报工作!");
m.command("B");
}
@Override
public void develop() {
System.out.println("我是B,我负责后端功能开发!");
}
}
ConcreteColleagueC同事实现类
package com.mediator;
public class ConcreteColleagueC implements Colleague {
private Mediator m; //持有中介者的引用
public ConcreteColleagueC(Mediator m) {
super();
this.m = m;
m.register("C", this);
}
@Override
public void report() {
System.out.println("我是C!我要汇报工作!");
m.command("C");
}
@Override
public void develop() {
System.out.println("我是C,我负责数据库设计!");
}
}
客户端测试代码Client-Main
package com.mediator;
public class Main {
public static void main(String[] args) {
// 获取中介者对象
Mediator m = new ConcreteMediator();
// 获取同事对象,实例化的时候会在中介者对象中注册
ConcreteColleagueA colleagueA = new ConcreteColleagueA(m);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(m);
ConcreteColleagueC colleagueC = new ConcreteColleagueC(m);
colleagueA.report();
colleagueB.report();
colleagueC.report();
}
}
运行结果展示:
好了,到这里【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】就结束了,23种设计模式持续更新汇总中。