面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>>
在阎宏博士的《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");
}
}
将来添加优点和缺点,使用条件