六十三:调停者模式

调停者模式包装了一系列对象相互作用的方式,使得这些对象不必互相明显引用,从而使它们可以较松散地耦合,当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用,从而保证这些相互作用可以彼此独立地变化.
不要对设计模式有盲目的崇拜和过分地追求.我们要全力以赴地为我们所面临的困难找出最好的设计,而不是将力气放在如何尽可能多和频繁地使用著名的模式.最主要的是需求不要和设计脱节.停调者模式是很容易被滥用的模式.

一:为什么需要调停者对象
如果有大量的对象,这些对象既会影响到别的对象,又会被别的对象所影响,因此常常叫做同事(Colleague)对象。如果几乎每一个对象都需要和其他对象发生作用,而这种作用表现为一个对象与另一个对象的直接耦合,这将造成系统过度耦合.如果引入调停者对象(Mediator),可以将系统的网状结构变成以Mediator为中介的星形结构.这样可以使对象之间增加协作性,减少耦合度.
一个对象往往要与几个对象发生相互作用,就好比在一个小组中工作的人一样,每一个人都要与他的同事发生相互作用。这时,一个直接了当的不好的设计会把那些与他的对象固定到每一个对象上面,这样做的结果自然是使这些对象独立演化的难度增加,使每一个对象的变化都会影响到所有与之发生相互作用的对象。这就好比每一个在小组中工作的人都要成为其他人的经理,不仅仅要管好自己,还有管好其他有的同事.在实际工作中,一个有效的管理制度是给这个小组配备一个小组长,负责协调小组成员之间的关系,小组的同事通过小组长可以形成整个小组的行为,这实际上就是调停者模式的精神.
在没有WTO之前,各个贸易地区自行进行的相互协调和谈判进行交易,在有WTO(相当于调停者)后,各国的贸易由WTO进行协调.

二:调停者角色
此模式主要包含有如下角色:
(A)抽象调停者角色:定义出同事对象到调停者对象的接口,其中主要的方法是一个(或多个)事件方法.在有些情况下,这个抽象可以省略。
(B)具体调停者角色:实现抽象调停者角色,具体调停者知道所有的具体同事类,它从具体同事对象接收消息,向具体同事对象出出命令
(C)抽象同事类角色:定义出调停者到同事对象的接口。同事对象只知道调停者而不知道其余的同事对象(这和现实不同哦)
(D)具体同事类角色:每一个具体同事类都很清楚自己在小范围的行为,而不知道它在大范围内的目的.
下面是示意源码:
package cai.milenfan.basic.test;
//抽象同事角色
public abstract class Colleague {
private Mediator mediator;
public Mediator getMediator() {
return mediator;
}
public Colleague(Mediator m) {
mediator = m;
}
public abstract void action();
public void change() {
mediator.colleagueChanged(this);
}
}


package cai.milenfan.basic.test;

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 cai.milenfan.basic.test;

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 cai.milenfan.basic.test;

public class Colleague3 extends Colleague {
public Colleague3(Mediator m) {
super(m);
}
public void action() {
System.out.println("This is an action from Colleague 3");
}
}


package cai.milenfan.basic.test;

public abstract class Mediator {
public abstract void colleagueChanged(Colleague c);
public static void main(String args[]) {
ConcreteMediator mediator = new ConcreteMediator();
mediator.createConcreteMediator();
Colleague c1 = new Colleague1(mediator);
Colleague c2 = new Colleague2(mediator);
mediator.colleagueChanged(c1);
}
}


package cai.milenfan.basic.test;

public class ConcreteMediator extends Mediator {
private Colleague1 colleague1;
private Colleague2 colleague2;
public void colleagueChanged(Colleague c) {
colleague1.action();
colleague2.action();
}
public void createConcreteMediator() {
colleague1 = new Colleague1(this);
colleague2 = new Colleague2(this);
}
public Colleague1 getColleague1() {
return colleague1;
}
public Colleague2 getColleague2() {
return colleague2;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值