行爲模式---之--調停者模式

調停者模式是對象的行爲模式。調停者模式包裝了一系列相互做用的方式,使得這些對象沒必要互相明顯引用。從而使它們能夠較鬆散地耦合。當這些對象中的某些對象之間的相互做用發生改變時,不會當即影響到其餘的一些對象之間的相互做用。從而保證這些相互做用能夠彼此獨立地變化。
 
在調停者模式中,全部的成員對象均可以協調工做,可是又不直接相互管理。這些對象都與一個處於中心地位的調停者對象發生緊密關係,由這個調停者對象進行協調工做。這個協調者對象叫作調停者(Mediator),而調停者所協調的成員對象稱作同事(Colleague)對象。
 
調停者模式包括幾個角色:
1.抽象調停者角色:定義出同事對象到調停者對象的接口,其中主要的方法是一個或多個事件方法,在有些狀況下,這個抽象對象能夠省略。通常而言,這個角色由一個Java抽象類或Java對象實現
2.具體調停者角色:從抽象調停者類繼承而來,實現了抽象超類所聲明的事件方法。具體調停者知曉全部的具體同事類,它從具體同事對象接收消息,向具體同事對象發出命令,通常而言,這個角色由一具體Java類實現
3.抽象同事類角色:定義出調停者到同事對象的接口。同事對象只知道調停者而不知道其他的同事對象。通常而言,這個角色由一個Java抽象類或Java對象實現
4.具體同事類角色:全部的具體同事類均從抽象同事類繼承而來。每個具體同事類都很清楚它本身在小範圍內的行爲,而不知道它在大範圍內的目的。
 1 //抽象同事類
 2 abstract class Colleague{
 3     private Mediator mediator;
 4     public Colleague(Mediator mediator){
 5         this.mediator = mediator;
 6     }
 7     //取值方法
 8     public Mediator getMediator(){
 9         return mediator;
10     }
11     //行動方法,由子類實現,一個同事對象在知道其餘對象有變化時,會執行這個操做
12     public abstract void action();
13     //示意性業務方法,調用此方法能夠改變對象的內部狀態
14     public void change(){
15         mediator.colleagueChanged(this);
16     }
17 }
18 //具體同事類
19 class Colleague1 extends Colleague{
20     public Colleague1(Mediator m){
21         super(m);
22     }
23     @Override
24     public void action() {
25         System.out.println("This is an action from Colleague 1");
26     }
27     
28 }
29 
30 class Colleague2 extends Colleague{
31     public Colleague2(Mediator m){
32         super(m);
33     }
34     @Override
35     public void action() {
36         System.out.println("This is an action from Colleague 2");
37     }
38     
39 }
40 
41 //抽象調停者
42 abstract class Mediator{
43     public abstract void colleagueChanged(Colleague e);
44     
45     public static void main(String[] args) {
46         ConcreteMediator mediator = new ConcreteMediator();
47         mediator.createConcreteMediator();
48         Colleague c1 = new Colleague1(mediator);
49         Colleague c2 = new Colleague2(mediator);
50         mediator.colleagueChanged(c1);
51     }
52 }
53 
54 //具體調停者
55 class ConcreteMediator extends Mediator{
56     private Colleague1 colleague1;
57     private Colleague2 colleague2;
58     //事件方法的具體實現
59     @Override
60     public void colleagueChanged(Colleague e) {
61         colleague1.action();
62         colleague2.action();
63     }
64     //工廠方法,建立同事對象
65     public void createConcreteMediator(){
66         colleague1 = new Colleague1(this);
67         colleague2 = new Colleague2(this);
68     }
69     //取值方法
70     public Colleague1 getColleague1(){
71         return colleague1;
72     }
73     public Colleague2 getColleague2(){
74         return colleague2;
75     }
76 }

 

 
優勢:
1.能夠較少使用靜態的繼承關係,使得具體同事類能夠更加容易被複用
2.能夠避免同事對象之間的過分耦合,使得調停類與同事類能夠相對獨立地演化
3.能夠將多對多的相互做用轉化 爲一對多的相互做用,使得對象之間的關係更加易於維護和理解
4.將對象的行爲和協做抽象化,把對象在小尺度的行爲上與其餘對象的相互做用分開處理
缺點:
1.下降了同事對象的複雜性,代價是增長了調停者類的複雜性
2.調停者類常常充滿了各個具體同事類的關係協調代碼,這種代碼經常是不能複用的。所以,具體同事類的複用是以調停者類的不可複用爲代價的。
這個模式所提供的可擴展性(向同事對象)傾斜的可擴展性。
相關文章
相關標籤/搜索