人在江湖

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

          一、 模式定義:
          用一個中介者對象來封裝一系列的對象交互。中介者使各對象不需要顯式的相互引用,從而使其耦合松散,而且可以獨(dú)立的改變他們之間的交互。
          二、 結(jié)構(gòu)圖
          (略)
          1) 抽象中介者:定義同事(Colleague)對象到中介者(Mediatior)對象的接口,通常是一個事件方法。
          2) 具體中介者:具體中介者實(shí)現(xiàn)抽象中介者聲明的方法。知曉所有的具體同事類,從具體同事接收消息向另外的具體同事類發(fā)送命令。
          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:  

          五、 優(yōu)缺點(diǎn)
          1)減少了子類生成Mediator將原本分布于多個對象間的行為集中在一起,改變這些行為只需生成Mediator的子類即可,這樣各個Colleague類可被重用。
          2)它將各Colleague解耦。Mediator有利于各Colleague間的松耦合,你可以獨(dú)立的改變和復(fù)用各Colleague類和Mediator類。
          3)它簡化了對象協(xié)議用Mediator和各Colleague間的一對多的交互來代替多對多的交互。一對多的關(guān)系更易于理解、維護(hù)和擴(kuò)展。
          4)它對對象如何協(xié)作進(jìn)行了抽象將中介作為一個獨(dú)立的概念并將其封裝在一個對象中,使你將注意力從對象各自本身的行為轉(zhuǎn)移到它們之間的交互上來。這有助于弄清楚一個系統(tǒng)中的對象是如何交互的。
          5)它使控制集中化,中介者模式將交互的復(fù)雜性變?yōu)橹薪檎叩膹?fù)雜性。因?yàn)橹薪檎叻庋b了協(xié)議,它可能變得比任一個Colleague都復(fù)雜。這可能使得中介者自身成為一個難于維護(hù)的龐然大物。
          六、 適用性
          1)一組對象以定義良好但是復(fù)雜的方式進(jìn)行通信。產(chǎn)生的相互依賴關(guān)系結(jié)構(gòu)混亂且難以理解。
          2)一個對象引用其他很多對象并且直接與這些對象通信,導(dǎo)致難以復(fù)用該對象。

          posted on 2011-02-08 17:32 人在江湖 閱讀(648) 評論(0)  編輯  收藏 所屬分類: design pattern
          主站蜘蛛池模板: 阿拉尔市| 建昌县| 那曲县| 静乐县| 鄂托克旗| 华池县| 曲沃县| 宁都县| 垫江县| 青神县| 田林县| 竹山县| 高密市| 静海县| 高碑店市| 景洪市| 韶山市| 蓬莱市| 博客| 绥阳县| 武鸣县| 京山县| 五台县| 宜都市| 贵阳市| 彭阳县| 全南县| 乐至县| 金湖县| 正阳县| 河北省| 翼城县| 康平县| 开封县| 龙州县| 伊川县| 吴江市| 乌兰浩特市| 余姚市| 望奎县| 福海县|