一、 模式定義:
用一個中介者對象來封裝一系列的對象交互。中介者使各對象不需要顯式的相互引用,從而使其耦合松散,而且可以獨立的改變他們之間的交互。
二、 結構圖
(略)
1) 抽象中介者:定義同事(Colleague)對象到中介者(Mediatior)對象的接口,通常是一個事件方法。
2) 具體中介者:具體中介者實現抽象中介者聲明的方法。知曉所有的具體同事類,從具體同事接收消息向另外的具體同事類發送命令。
3) 抽象同事類:定義中介者到同事對象的接口,同事對象只知道中介者而不知道其他同事對象。
三、一個例子
1: import java.util.ArrayList;
2:
3: abstract class AbstractMediator{
4: public abstract void register(AbstractColleague ac);
5: public abstract void ColleagueChanged(AbstractColleague ac);
6: }
7: abstract class AbstractColleague{
8: private AbstractMediator med;
9: public AbstractColleague(AbstractMediator mediator){
10: this.med=mediator;
11: }
12: public abstract void action();
13: public void changed(){
14: med.ColleagueChanged(this);
15: }
16: }
17: class ConcreteMediator extends AbstractMediator{
18:
19: private ArrayList<AbstractColleague> colleagueList=new ArrayList<AbstractColleague>();
20: public void register(AbstractColleague ac) {
21: colleagueList.add(ac);
22: }
23:
24: public void ColleagueChanged(AbstractColleague ac) {
25: for(int i=0;i<colleagueList.size();i++){
26: if(colleagueList.get(i)!=ac){
27: colleagueList.get(i).action();
28: }
29: }
30: }
31: }
32:
33: class ConcreteColleagueA extends AbstractColleague{
34: public ConcreteColleagueA(AbstractMediator mediator){
35: super(mediator);
36: mediator.register(this);
37: }
38: public void action() {
39: System.out.println("AAAAAAAAAAAAAAA");
40: }
41: }
42: class ConcreteColleagueC extends AbstractColleague{
43: public ConcreteColleagueC(AbstractMediator mediator){
44: super(mediator);
45: mediator.register(this);
46: }
47: public void action() {
48: System.out.println("CCCCCCCCCCCCCCC");
49: }
50: }
51: class ConcreteColleagueB extends AbstractColleague{
52: public ConcreteColleagueB(AbstractMediator mediator){
53: super(mediator);
54: mediator.register(this);
55: }
56: public void action() {
57: System.out.println("BBBBBBBBBBBBBBB");
58: }
59: }
60: class test{
61: public static void main(String[] args){
62: AbstractMediator mediator=new ConcreteMediator();
63: AbstractColleague colleagueA=new ConcreteColleagueA(mediator);
64: AbstractColleague colleagueB=new ConcreteColleagueB(mediator);
65: AbstractColleague colleagueC=new ConcreteColleagueC(mediator);
66: colleagueA.changed();
67: colleagueB.changed();
68: colleagueC.changed();
69: }
70: }
71:
五、 優缺點
1)減少了子類生成Mediator將原本分布于多個對象間的行為集中在一起,改變這些行為只需生成Mediator的子類即可,這樣各個Colleague類可被重用。
2)它將各Colleague解耦。Mediator有利于各Colleague間的松耦合,你可以獨立的改變和復用各Colleague類和Mediator類。
3)它簡化了對象協議用Mediator和各Colleague間的一對多的交互來代替多對多的交互。一對多的關系更易于理解、維護和擴展。
4)它對對象如何協作進行了抽象將中介作為一個獨立的概念并將其封裝在一個對象中,使你將注意力從對象各自本身的行為轉移到它們之間的交互上來。這有助于弄清楚一個系統中的對象是如何交互的。
5)它使控制集中化,中介者模式將交互的復雜性變為中介者的復雜性。因為中介者封裝了協議,它可能變得比任一個Colleague都復雜。這可能使得中介者自身成為一個難于維護的龐然大物。
六、 適用性
1)一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解。
2)一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象。