设计模式之中介者模式(mediator)

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互;

中介者模式属于行为型模式。

优点:

  • 降低了类的复杂度,将一对多转化成了一对一。
  • 各个类之间的解耦。 3、符合迪米特原则。

缺点:

  • 中介者会庞大,变得复杂难以维护。

应用场景:

  • 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

参与者

  • Mediator 中介者定义一个接口用于与各同事(Colleague)对象通信。
  • ConcreteMediator 具体中介者通过协调各同事对象实现协作行为。 了解并维护它的各个同事。
  • Colleagueclass 每一个同事类都知道它的中介者对象。 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信

Java 中介者模式(mediator) 示例

生活中有这样的一个例子,有房子的人把自己的房子交给中介,让他们帮他出租! 有房子的人告诉中介他的要求,租金,最少租一年等; 而租用房子的人则会问一些价格能不能少点啊。。。

  • 先定义一个接口,租房人和出租人通信接口
public interface Message {
	public  void receiveMessage(String msg);
}
  • 定义抽象人物角色
public abstract class People implements Message
{
}
  • 定义出租人实体
public class Lessor extends People implements Message {
	public void receiveMessage(String msg)
	{
		LogHelper.log("出租人收到一条消息:" + msg);
	}
}
  • 定义租房人实体
public abstract class People implements Message
{
}
  • 定义中介
// 中介
public class Mediator {
	private People mLessor;
	private People mRenter;

	public void setmLessor(People mLessor) {
		this.mLessor = mLessor;
	}
	public void setmRenter(People mRenter) {
		this.mRenter = mRenter;
	}

	public void sendMessage(People p, String message)
	{
		if(p == mLessor)
		{
			mRenter.receiveMessage(message);
		}
		else
		{
			mLessor.receiveMessage(message);
		}
	}
}
  • 测试
public static void main(String[] args)
{
  People u1 = new Lessor();
  People u2 = new Renter();

  Mediator m = new Mediator();
  m.setmLessor(u1);
  m.setmRenter(u2);

  // 租房人调用这个方法
  m.sendMessage(u2, "房子还行,这个租金能不能便宜点?");

  // 出租人调用
  m.sendMessage(u1, "最多给你便宜100!");
}

运行结果为:

【www.pangugle.com】-  出租人收到一条消息:房子还行,这个租金能不能便宜点?
【www.pangugle.com】-  租房人收到一条消息:最多给你便宜100!

这里的本质是出租人和租房人他们不直接对话,而是通过中介来对话,这样的好处就是:

  • 出租人把要求告诉中介,并把钥匙给中介就只可以了,这样出租人就可以做其它事了!
  • 对于租房人来说,他不需要逐个打电话给出租人,他现在只要找中介就好了。