1、中介者模式的简介:
a、中介者模式的核心:
- 如果一个系统中对象之间的联系是呈现为网状结构,对象之间存在大量多对多关系,将导致关系极其复杂,这些对象称为“同事对象”。
- 我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构解为如下的星型结构。
b、模式中主要的类介绍:
- Mediator 抽象中介者:定义了同事对象到中介者对象的接口。
- ConcreteMediator 具体中介者对象:实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
- Colleague:抽象同事类
- ConcreteColleague:具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象。
2、简单的代码演示:
a、Department 接口是抽象的同事类,Development、Markert、Finacial 类是具体的同事类,Persident 类是具体的中介者类。
package com.geeklicreed.mediator;
public interface Department {
void selfAction();
void outAction();
}
package com.geeklicreed.mediator;
public class Development implements Department {
private Mediator mediator;
@Override
public void selfAction() {
System.out.println("研发部本职工作,致力于研发");
}
@Override
public void outAction() {
System.out.println("研发部遇到的问题:研发受阻,需要资金支持哒!");
mediator.command("finacial");
}
public Development(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("development", this);
}
public Development() {
// TODO Auto-generated constructor stub
}
}
package com.geeklicreed.mediator;
public class Markert implements Department {
private Mediator mediator;
public Markert() {
// TODO Auto-generated constructor stub
}
public Markert(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("markert", this);
}
@Override
public void selfAction() {
System.out.println("市场部的本职工作:和客户接洽,协商项目");
}
@Override
public void outAction() {
System.out.println("市场部遇到的问题,在外跑业务需要资金支持");
mediator.command("finacial");
}
}
package com.geeklicreed.mediator;
public class Finacial implements Department {
private Mediator mediator;
@Override
public void selfAction() {
System.out.println("资金部本职工作:结算公司账单,调度公司资金运转!");
}
@Override
public void outAction() {
System.out.println("资金部遇到的问题,我们需要技术支持!");
mediator.command("development");
}
public Finacial(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("finacial", this);
}
public Finacial() {
// TODO Auto-generated constructor stub
}
}
package com.geeklicreed.mediator;
public interface Mediator {
void command(String dName);
void register(String dName, Department dept);
}
package com.geeklicreed.mediator;
import java.util.HashMap;
import java.util.Map;
public class Persident implements Mediator{
private Map<String, Department> map = new HashMap<String, Department>();
public void command(String dName) {
map.get(dName).selfAction();
}
public void register(String dName, Department dept) {
map.put(dName, dept);
}
}
b、看看 Client 测试类中输出的结果,以及示例代码中的类图关系。
package com.geeklicreed.mediator;
public class Client {
public static void main(String[] args) {
Mediator mediator = new Persident();
Department dept1 = new Development(mediator);
Department dept2 = new Markert(mediator);
Department dept3 = new Finacial(mediator);
dept1.selfAction();
System.out.println("总经理调度:");
dept1.outAction();
System.out.println("-----------------------------------");
dept3.selfAction();
System.out.println("总经理调度:");
dept3.outAction();
System.out.println("------------------------------------");
dept2.selfAction();
System.out.println("总经理调度:");
dept2.outAction();
/*输出结果为:
研发部本职工作,致力于研发
总经理调度:
研发部遇到的问题:研发受阻,需要资金支持哒!
资金部本职工作:结算公司账单,调度公司资金运转!
-----------------------------------
资金部本职工作:结算公司账单,调度公司资金运转!
总经理调度:
资金部遇到的问题,我们需要技术支持!
研发部本职工作,致力于研发
------------------------------------
市场部的本职工作:和客户接洽,协商项目
总经理调度:
市场部遇到的问题,在外跑业务需要资金支持
资金部本职工作:结算公司账单,调度公司资金运转!*/
}
}
3、开发中常见的场景:
- MVC 模式(其中的 C,控制器就是一个中介者对象。M 和 V 都和他打交道。)
- 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象。
转载于:https://blog.51cto.com/12402717/1929485