调停者模式

面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>>   hot3.png

在阎宏博士的《JAVA与模式》一书中开头是这样描述调停者(Mediator)模式的:

  调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松 散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

什么是调停者

 在调停者模式中,所以的成员对象都是可以协调工作,但是又不直接相互管理。这些对象都与一个处于中心位置地位的调停者对象发生紧密的关系。有这个调停者对象进行协调工作。

为什么需要调停者

  如下图所示,这个示意图中有大量的对象,这些对象既会影响别的对象,又会被别的对象所影响,因此常常叫做同 事(Colleague)对象。这些同事对象通过彼此的相互作用形成系统的行为。从图中可以看出,几乎每一个对象都需要与其他的对象发生相互作用,而这种 相互作用表现为一个对象与另一个对象的直接耦合。这就是过度耦合的系统。

通过引入调停者对象(Mediator),可以将系统的网状结构变成以中介者为中心的星形结构,如下图所示。在这个星形结构中,同事对象不再通过直接的联 系与另一个对象发生相互作用;相反的,它通过调停者对象与另一个对象发生相互作用。调停者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因 为新对象的引入造成大量的修改工作。

 

一个好的面向对象的设计可以使对象之间增加协作性(Collaboration),减少耦合度(Couping)。一个深思熟虑的设计会把一个系统分解为一群相互协作的同事对象,然后给每一个同事对象以独特的责任,恰当的配置它们之间的协作关系,使它们可以在一起工作。

类同如下

源代码如下


package com.jerry.pattern.mediator;
/***
 * 调停者模式
 *
 *
 * 2013-3-14
 */
public class Client
{
	/** 调停者 */
	private static ConcreteMediator mediator;
	
	private static Colleague c1, c2, c3;

	public static void main(String[] args)
	{
		mediator = new ConcreteMediator();
		mediator.createConcreteMediator();

		c1 = new Colleague1(mediator);
		c2 = new Colleague2(mediator);
		c3 = new Colleague2(mediator);

		mediator.colleagueChanged(c1);
		mediator.colleagueChanged(c2);
		mediator.colleagueChanged(c3);
	}
}

package com.jerry.pattern.mediator;

/**
 * 抽象同事角色 每个同事对象 仅知道调停者 而不知道其他同事对象
 */
public abstract class Colleague
{
	private Mediator mediator;

	public Colleague(Mediator m)
	{
		mediator = m;
	}

	/**
	 * 当前同时对象发生变化时,通知调停者
	 */
	public void change()
	{
		mediator.colleagueChanged(this);
	}

	/**
	 * 行动方法,一个同事对象在得知其他同事对象有变化时 会执行此方法
	 */
	public abstract void action();

	public Mediator getMediator()
	{
		return mediator;
	}
}

package com.jerry.pattern.mediator;

/**
 * note: 具体调停者角色
 */
public class ConcreteMediator extends Mediator
{
	private Colleague1 colleague1;
	private Colleague2 colleague2;
	private Colleague3 colleague3;

	/**
	 * 将所有同事 实例化
	 */
	public void createConcreteMediator()
	{
		colleague1 = new Colleague1(this);
		colleague2 = new Colleague2(this);
		colleague3 = new Colleague3(this);
	}

	/**
	 * 事件方法
	 * 
	 * @param c
	 */
	public void colleagueChanged(Colleague c)
	{
		System.out.println("-----------------start-----------");
		colleague1.action();
		colleague2.action();
		colleague3.action();
		System.out.println("-----------------end-----------");
	}

	/***********************************************************/
	/***
	 * 提供同事对象
	 * 
	 * @return
	 */
	public Colleague1 getColleague1()
	{
		return colleague1;
	}

	/***
	 * 提供同事对象
	 * 
	 * @return
	 */
	public Colleague2 getColleague2()
	{
		return colleague2;
	}

	/***
	 * 提供同事对象
	 * 
	 * @return
	 */
	public Colleague3 getColleague3()
	{
		return colleague3;
	}
}

package com.jerry.pattern.mediator;

/**
* note: 调停者角色
*/
abstract public class Mediator {

   /**
    * 事件方法
    * @param c
    */
   public abstract void colleagueChanged(Colleague c);

}

package com.jerry.pattern.mediator;

/**
 * note: 具体同事角色
 */
public class Colleague1 extends Colleague {
    public Colleague1(Mediator m) {
        super(m);
    }

    public void action() {
        System.out.println("This is an action from Colleague 1");
    }
}

package com.jerry.pattern.mediator;

/**
 * note: 具体同事角色
 */
public class Colleague2 extends Colleague {
    public Colleague2(Mediator m) {
        super( m );
    }

    public void action() {
        System.out.println("This is an action from Colleague 2");
    }
}

package com.jerry.pattern.mediator;
/***
 * 
 *
 * 2013-3-14
 */
public class Colleague3 extends Colleague {
    public Colleague3(Mediator m) {
        super( m );
    }

    public void action() {
        System.out.println("This is an action from Colleague 3");
    }
}

将来添加优点和缺点,使用条件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值