1、中介者模式的简介:

a、中介者模式的核心:

-  如果一个系统中对象之间的联系是呈现为网状结构,对象之间存在大量多对多关系,将导致关系极其复杂,这些对象称为“同事对象”。

-  我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构解为如下的星型结构。

设计模式之中介者模式_第1张图片   



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 map = new HashMap();
	
	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();
		
		/*输出结果为:
		研发部本职工作,致力于研发
		总经理调度:
		研发部遇到的问题:研发受阻,需要资金支持哒!
		资金部本职工作:结算公司账单,调度公司资金运转!
		-----------------------------------
		资金部本职工作:结算公司账单,调度公司资金运转!
		总经理调度:
		资金部遇到的问题,我们需要技术支持!
		研发部本职工作,致力于研发
		------------------------------------
		市场部的本职工作:和客户接洽,协商项目
		总经理调度:
		市场部遇到的问题,在外跑业务需要资金支持
		资金部本职工作:结算公司账单,调度公司资金运转!*/
	}
}


设计模式之中介者模式_第2张图片


3、开发中常见的场景:

-  MVC 模式(其中的 C,控制器就是一个中介者对象。M 和 V 都和他打交道。)

-  窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象。