Chan Chen Coding...

          導(dǎo)航

          統(tǒng)計(jì)

          文章分類(lèi)

          文章檔案

          最新評(píng)論

          Ten: Mediator Design Pattern

          Refer to: http://blog.sina.com.cn/s/blog_3fe961ae0100qbz6.html
          意圖
          通過(guò)引入中介者模式來(lái)在對(duì)象之間傳遞消息(承擔(dān)中介者),以簡(jiǎn)化對(duì)象之間的通信。
          什么是中介者模式
          中介者模式包裝了一系列對(duì)象相互作用的方式,使得這些對(duì)象不必互相明顯引用。從而使它們可以較松散地耦合。當(dāng)這些對(duì)象中的某些對(duì)象之間的相互作用發(fā)生改變時(shí),不會(huì)立即影響到其他的一些對(duì)象之間的相互作用。從而保證這些相互作用可以彼此獨(dú)立地變化。
          在中介者模式中,所有的成員對(duì)象者可以協(xié)調(diào)工作,但是又不直接相互管理。這些對(duì)象都與一個(gè)處于中心地位的中介者對(duì)象發(fā)生緊密的關(guān)系,由這個(gè)中介者對(duì)象進(jìn)行協(xié)調(diào)工作。這個(gè)協(xié)調(diào)者對(duì)象叫做中介者(Mediator),而中介者所協(xié)調(diào)的成員對(duì)象稱(chēng)做同事(Colleague)對(duì)象。
          類(lèi)圖
          角色
          (1)抽象中介者(Mediator)角色:定義出同事對(duì)象到中介者對(duì)象的接口,其中主要的方法是一個(gè)(或者多個(gè))事件方法。在有些情況下,這個(gè)抽象對(duì)象可以省略。
          (2)具體中介者(ConcreteMediator)角色:從抽象中介者繼承而來(lái),實(shí)現(xiàn)了抽象超類(lèi)所聲明的事件方法。具體中介者知曉所有的具體同事類(lèi),它從具體同事對(duì)象接收消息、向具體同事對(duì)象發(fā)出命令。
          (3)抽象同事類(lèi)(Colleague)角色:定義出中介者到同事對(duì)象的接口。同事對(duì)象只知道中介者而不知道其余的同事對(duì)象。
          (4)具體同事類(lèi)(ConcreteColleague)角色:所有的具體同事類(lèi)均從抽象同事類(lèi)繼承而來(lái)。每一個(gè)具體同事類(lèi)都很清楚它自己在小范圍內(nèi)的行為,而不知道它在大范圍內(nèi)的目的。在示意性的類(lèi)圖中,具體同事類(lèi)是Colleague1和Colleague2。
           
          源代碼
          package 中介者模式;
          //抽象中介者
          public abstract class Mediator {
           
          //事件方法,由子類(lèi)實(shí)現(xiàn)
          public abstract void colleagueChanged(Colleague c);
          }
           
           
          package 中介者模式;
          //抽象同事類(lèi)
          public abstract class Colleague {
            private Mediator mediator;
           
          //構(gòu)造函數(shù),中介者作為參數(shù)
          public Colleague(Mediator m){
            this.mediator=m;
          }
           
          public Mediator getMediator(){
            return this.mediator;
          }
           
          //行動(dòng)方法,由子類(lèi)實(shí)現(xiàn)
          public abstract void action();
           
          //當(dāng)同事對(duì)象發(fā)生變化時(shí),告知中介者
          public void change(){
            mediator.colleagueChanged(this);
          }
          }
           
           
          package 中介者模式;
           
          public class Colleague1 extends Colleague {
           
          public Colleague1(Mediator m) {
            super(m);
          }
           
          @Override
          public void action() {
            System.out.println("Colleague1 action");
          }
           
          }
           
           
           
          package 中介者模式;
           
          public class Colleague2 extends Colleague {
           
          public Colleague2(Mediator m) {
            super(m);
          }
           
          @Override
          public void action() {
            System.out.println("Colleague2 action");
          }
           
          }
           
           
           
          package 中介者模式;
          //具體中介者
          public class ConcreteMediator extends Mediator{
           
          private Colleague1 colleague1;
          private Colleague2 colleague2;
           
          @Override
          public void colleagueChanged(Colleague c) {
          //中介者通知其它同事對(duì)象作出響應(yīng),實(shí)際的代碼要復(fù)雜得多
            if(c==colleague1){
              System.out.println("colleague1發(fā)生改變,其他同事對(duì)象作出響應(yīng)");
              this.colleague2.action();
            }else if(c==colleague2){
              System.out.println("colleague2發(fā)生改變,其他同事對(duì)象作出響應(yīng)");
              this.colleague1.action();
            }
          }
           
          public void createConcreteColleague(){
            colleague1=new Colleague1(this);
            colleague2=new Colleague2(this);
          }
           
          public Colleague1 getColleague1() {
            return colleague1;
          }
           
          public Colleague2 getColleague2() {
          return colleague2;
          }
          }
           
           
          package 中介者模式;
           
          public class Client {
          public static void main(String[] args) {
            ConcreteMediator m = new ConcreteMediator();
            m.createConcreteColleague();
            Colleague c1=m.getColleague1();
            Colleague c2=m.getColleague2();
            c1.change();
            c2.change();
           }
          }
           
          輸出:
          colleague1發(fā)生改變,其他同事對(duì)象作出響應(yīng)
          Colleague2 action
          colleague2發(fā)生改變,其他同事對(duì)象作出響應(yīng)
          Colleague1 action


          -----------------------------------------------------
          Silence, the way to avoid many problems;
          Smile, the way to solve many problems;

          posted on 2012-11-05 11:45 Chan Chen 閱讀(238) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Design Pattern

          主站蜘蛛池模板: 民权县| 进贤县| 汉阴县| 横山县| 西宁市| 香港| 射洪县| 集安市| 筠连县| 习水县| 游戏| 林西县| 宣化县| 宝鸡市| 水富县| 白玉县| 磐安县| 德化县| 呼玛县| 太仆寺旗| 瓦房店市| 兴海县| 百色市| 平度市| 沙洋县| 湖州市| 城市| 恩施市| 汉川市| 古田县| 堆龙德庆县| 大渡口区| 荥阳市| 和林格尔县| 原阳县| 区。| 康平县| 闽清县| 永安市| 泗水县| 平湖市|