java设计模式-Mediator(中介者)模式

[b][size=medium]Mediator中介者模式定义[/size][/b]
Mediator 中介者,或者叫仲裁者,类似房屋的中介,比如演播室的主播和嘉宾,主播在说话的时候,嘉宾不能打断他,主播停止说话的时候嘉宾才能说话,主播则可以随时说话,这里还有一个中间人:
1.主播对中介者说,节目开始了,我要说话了
2.中介者看看嘉宾是不是在说话,如果是在说话,让他停止,让主播说,如果嘉宾没在说话,让主播说
3.嘉宾告诉中介者说我要说话,中介者看看主播是否在说话,如果在说话,就告诉嘉宾说主播在说,你等等再说;如果主播不在说话,则让嘉宾说

代码例子如下:

package mediator;
/*
* 中介者类,并和两个参与者进行关联,两个参与者在中介者这里注册
*/
public class Mediator {
private Anchor anchor;
private Guest guest;
public void regAnchor(Anchor anchor){
this.anchor=anchor;
}
public void regGuest(Guest guest){
this.guest=guest;
}
//中介代替主持人说话,如果嘉宾在说话,打断他,主持人说,主持人的状态变为忙碌
public void anchorSpeak(){
if(!guest.isFree()){
guest.stop();
}
System.out.println("Anchor is speaking....");
anchor.setFree(false);
}
//中介代替嘉宾说话,如果主持人空闲,嘉宾才能说话,嘉宾状态变为忙碌,
//否则,不让嘉宾说话,主持人继续说
public void guestSpeak(){
if(anchor.isFree()){
System.out.println("Guest is speaking....");
guest.setFree(false);
}
else{
System.out.println("Anchor is speaking. Do not interrupt...");
}

}
//中介代替主持人停止说话,设置状态为空闲
public void anchorStop(){
System.out.println("Anchor stop speaking now....");
anchor.setFree(true);
}
//中介代替嘉宾停止说话,设置状态为空闲
public void guestStop(){
System.out.println("Guest stop speaking now...");
guest.setFree(true);

}
}






package mediator;
/*
* 主持人类,有一个状态,是否处于空闲状态
* 有一个终结者的私有属性,和中介者产生关系
*/
public class Anchor {
private boolean free;

private Mediator med;
public Anchor(Mediator md){
med=md;
}

public boolean isFree() {
return free;
}

public void setFree(boolean free) {
this.free = free;
}

//通过中介者来开始说话
public void speak() {
med.anchorSpeak();
}

//通过中介者来停止说话
public void stop() {
med.anchorStop();
}

}





package mediator;
/*
* 嘉宾类,私有属性标记是否空闲
* 私有属性中介者,与中介者产生关系
*/
public class Guest {
private boolean free;

private Mediator med;

public Guest(Mediator md) {
this.med = md;
}

public boolean isFree() {
return free;
}

public void setFree(boolean free) {
this.free = free;
}

//通过中介者开始说话
public void speak() {
med.guestSpeak();

}
//通过中介者停止说话
public void stop() {
med.guestStop();
}
}




package mediator;

public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//新建一个中介者
Mediator med = new Mediator();

//新建一个主持人,并和中介者关联,让主持人知道中介都有什么能力(什么方法)
Anchor anchor = new Anchor(med);

//新建一个嘉宾,并和中介者关联,让嘉宾知道中介都能什么能力(什么方法)
Guest guest=new Guest(med);

//在中介者里面,注册主持人,和嘉宾,让中介者知道嘉宾和主持人都需要什么
med.regAnchor(anchor);
med.regGuest(guest);

//主持人说
anchor.speak();

//嘉宾说
guest.speak();

//主持人停止
anchor.stop();

//嘉宾说
guest.speak();

//主持人说
anchor.speak();

}
}


[img]http://dl.iteye.com/upload/attachment/0072/4522/e9fbb24c-99a8-3f74-bd87-582004973cb6.jpg[/img]

中介者就是一个处于众多对象,并恰当地处理众多对象之间相互之间的联系的角色。

以上代码中只有两个参与者类,,但是这些我们都可以根据中介者模式的宗旨进行适当地扩展,即增加参与者类,然后中介者就得担负更加重的任务了,我们看到上面具体中介者类Mediator中的方法比较多而且有点乱。

所以,在解耦参与者类之间的联系的同时,中介者自身也不免任务过重,因为几乎所有的业务逻辑都交代到中介者身上了,可谓是“万众期待”的一个角色了。这就是中介者模式的不足之处了 。
此外,上面这个代码例子的参与者的属性和方法都是一样的,我们可以抽取一个抽象类出来,减少代码,但是有时候我们根本抽取不了多个“参与者”之间的共性来形成一个抽象类,这也大大增加了中介者模式的使用难度。


[img]http://dl.iteye.com/upload/attachment/0072/4525/06242746-18bf-3afd-a750-4d2621bdfac3.jpg[/img]

参考:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值