【Java设计模式】行为型模式-中介者模式
2018-10-26 本文已影响0人
灰色孤星
源代码:https://gitee.com/AgentXiao/BehavioralPatterns
要点:
1、中介者模式的核心和本质
2、实现过程
一、引入案例
公司下面三个部门:财务部、市场部、研发部。财务部要发工资,需要让大家核对,需要跟市场部和研发部都通气;市场部要接个新项目,需要研发部处理技术、需要财务部出资金。市场部需要跟各个部门打交道。虽然只有三个部门,但是关系非常乱。
实际上,公司都有总经理。各个部门有什么事情都通报到总经理这里,总经理再通知各 个相关部门。
这就是一个典型的“中介者模式” ,总经理起到一个中介、协调的作用。
二、中介者模式的核心
如果一个系统中对象之间呈现网状结构,对象之间存在大量的多对多关系,将导致系统非常复杂,这些对象称为“同事对象”。
引入一个中介者对象,使得每个同事对象只跟中介者对象打交道,将复杂的网状机构化解为星型结构。
网状结构化解为星型结构 中介者模式类图三、中介者模式的实现
1、抽象中介者
/**
* @interfaceName Mediator
* @Description 抽象中介者
* @Author xwd
* @Date 2018/10/26 9:51
*/
public interface Mediator {
/**
* @MethodName getMsgFromDepartment
* @Descrition 得到部门发送过来的信息
* @Param [msg]
* @return void
*/
void getMsgFromDepartment(String msg);
/**
* @MethodName sendTaskToDepartment
* @Descrition 向指定的部门发出任务
* @Param [department, task]
* @return void
*/
void sendTaskToDepartment(String department,String task);
}
2、具体中介者(总经理)
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName Manager
* @Description 具体中介者(总经理)
* @Author xwd
* @Date 2018/10/26 9:53
*/
public class Manager implements Mediator{
private Map<String,Department> map = new HashMap<>();//存放部门信息
public void setRelation(String depart,Department department){
map.put(depart,department);
}
@Override
public void sendTaskToDepartment(String department, String task) {
map.get(department).getRequestFromManager(task);
}
@Override
public void getMsgFromDepartment(String msg) {
System.out.println(msg);
}
}
总经理和各个部门的关系是一对多的关系,因此存放在一个Map集合中。
3、抽象同事类(部门类)
/**
* @InterfaceName Department
* @Description 抽象同事类(部门)
* @Author xwd
* @Date 2018/10/26 9:46
*/
public interface Department {
/**
* @MethodName sendRequestToManager
* @Descrition 发送请求给总经理
* @Param [req]
* @return void
*/
void sendRequestToManager(String req);
/**
* @MethodName getRequestFromManager
* @Descrition 接收总经理的任务
* @Param [task]
* @return void
*/
void getRequestFromManager(String task);
}
4、具体同事类(具体部门)
/**
* @ClassName Development
* @Description 具体同事类(研发部门)
* @Author xwd
* @Date 2018/10/26 9:55
*/
public class Development implements Department{
private Manager manager;//持有总经理的引用
public Development(Manager manager) {
this.manager = manager;
this.manager.setRelation("development",this);
}
@Override
public void sendRequestToManager(String req) {
this.manager.getMsgFromDepartment(req);
}
@Override
public void getRequestFromManager(String task) {
System.out.println(task);
}
}
这里我们只列举了一个实际部门,实际上存在多个部门时使用中介者模式才能体现其效果。要点在于:每一个具体部门都持有总经理的引用,因此想要和其他部门打交道时,只需要将请求发送给总经理,统一由总经理进行分配。
5、测试
/**
* @ClassName Client
* @Description 测试
* @Author xwd
* @Date 2018/10/26 10:00
*/
public class Client {
public static void main(String[] args) {
Manager manager = new Manager();
Department development = new Development(manager);
development.sendRequestToManager("研发部:太穷了!没钱搞研发!");
manager.sendTaskToDepartment("development","好的收到!");
}
}
四、总结
1、本质
解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引 用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。
2、开发中的中介者模式
- MVC模式(其中的C,控制器就是一个中介者对象。M和V都和他打交 道) 。
- 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象。
- Java.lang.reflect.Method#invoke()