一、核心作用:
- 如果一个系统中对象那个之间的联系呈现为网状结构,对象存在大量多对多的关系,将导致关系及其复杂,这些对象称为“同事对象”
- 我们可以引入一个中介者对象,使各同事对象只跟中介者对象打交道,将复杂的网络结构化解为星状结构,解耦多个同事对象之间的交互关系
- 每个对象都持有中介者对象的引用,只跟中介者对象打交道,通过中介者对象统一管理这些交互关系
二、常见应用场景:
- MVC模式(C为中介者对象,MV与他打交道)
- 图形界面开发GUI,多个组件交互,引入中介者
三、中介者模式的实现:
- 抽象中介者(mediator):定义一个接口用于和对象通信
- 具体中介者(concreteMediator):协调各同时对象实现写作,维护各个同事
- 抽象同事角色(colleague):规定了同事的基本类型
- 具体同事角色(concreteColleague):每个同事都知道中介者
四、代码示例:
一、抽象中介者类:
package com.hezeu.mediator;
/**
* @Classname Mediator
* @Description 抽象中介者
* @Date 2020/2/26 上午 12:31
* @Created by 朱进博 1724282894@qq.com
*/
public interface Mediator {
void register(String dname,Department department);
void command(String dname);
}
二、具体中介者类:
package com.hezeu.mediator;
import java.util.HashMap;
import java.util.Map;
/**
* @Classname President
* @Description 具体中介者类
* @Date 2020/2/26 上午 12:47
* @Created by 朱进博 1724282894@qq.com
*/
public class President implements Mediator {
private Map<String,Department> map = new HashMap<>();
@Override
public void register(String dname, Department department) {
map.put(dname,department);
}
@Override
public void command(String dname) {
map.get(dname).selfAction();
}
}
三、抽象同事类:
package com.hezeu.mediator;
/**
* @Classname Department
* @Description 同事类接口
* @Date 2020/2/26 上午 12:33
* @Created by 朱进博 1724282894@qq.com
*/
public interface Department {
void selfAction(); //本不笨要做的事情
void outAction(); //向总经理发出的申请
}
四、具体同事类
package com.hezeu.iterator;
import java.util.ArrayList;
import java.util.List;
/**
* @Classname ConcreteAggregate
* @Description TODO
* @Date 2020/2/25 下午 07:34
* @Created by 朱进博 1724282894@qq.com
*/
public class ConcreteAggregate implements Aggregate{
private List<Object> list = new ArrayList<>();
public void addObject(Object obj) {
this.list.add(obj);
}
public void removeObject(Object obj) {
this.list.remove(obj);
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
public MyInteger createIterator() {
return new ConcreteIterator(list);
}
}
五、中介者模式的优缺点:
优点:
- 通过中介者,让对象彼此解耦,增加对象的复用性
- 通过将控制逻辑集中,可以简化系统维护
- 通过中介者使一对多变成了一对一,便于理解
缺点:
- 如果设计不好,引用中介者可能会使程序变复杂
- 中介者承担过多责任,维护不好事情更加麻烦