设计模式之中介者模式

来源:互联网 发布:淘宝上的内购群能信吗 编辑:程序博客网 时间:2024/06/04 01:06

1.定义:中介者模式,也称为调停者模式。封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。Define an object that encapsulates how a set of objects interact. Meditator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.

2.简单代码示例

public abstract class ZhongJieZhe {  //抽象的中介者类     protected Colleague1 collegue1;   //可以定义多可业务对象,单业务对象较多中介者模式的特征也就越显示出来     protected Colleague2 collegue2;   //中介者使各个对象不需要显示的交互,都由中介者来完成,从而使其耦合松散。     protected Colleague1 colleague3;          public Colleague1 getCollegue1() {   //中介者业务对象的注入return collegue1;}public void setCollegue1(Colleague1 collegue1) {this.collegue1 = collegue1;}public Colleague2 getCollegue2() {return collegue2;}public void setCollegue2(Colleague2 collegue2) {   this.collegue2 = collegue2;}public abstract void SendToOtherCollegue(); //中介者服务public abstract void MakeSomebodyDoSomething(String str );}
public class ZhongJie extends ZhongJieZhe{    //实际中介者类private static int cost=0;@Overridepublic void SendToOtherCollegue() {// TODO Auto-generated method stubSystem.out.println("先声明此次服务我中介者要收"+5);        super.getCollegue2().hehe();         cost+=5;}@Overridepublic void MakeSomebodyDoSomething(String str) {// TODO Auto-generated method stubint i=Integer.valueOf(str.substring(str.indexOf("[")+1,str.indexOf("[")+3));System.out.println("先声明此次服务我中介者要收"+6);super.getCollegue1().add(i);cost+=6;}public void sum(){System.out.println("我中介者目前赚了大概"+cost);}}
public class Colleague1 {                      //具体的业务对象类1,注意如果多个业务对象具有较多相似业务,可以定义更高层的抽象类或接口。   private static int count=10;   protected ZhongJieZhe zhongJieZhe;   public Colleague1(ZhongJieZhe zhongJieZhe)  //中介者注入,本类需要与其他类交互的地方,通过中介者来与其他类沟通。   {   this.zhongJieZhe=zhongJieZhe;   }       public void sub(int i)    //本类的业务逻辑       {       count-=i;       System.out.println("销售成功 count="+count);       if(count<8)   //如果count太小 则委托中介处理业务。       {       zhongJieZhe.SendToOtherCollegue();       }       }              public void add(int i)       {       System.out.println("中介者告诉我进货成功了,我不知道谁进的货。管他呢!货好就行");       count+=i;       System.out.println("进货成功 count="+count);       }              public void DoOtherThings()       {       System.out.println("这是Colleague1类,我要做我自己的事情");       }     }public class Colleague2 {                //具体的业务对象类2         ZhongJieZhe zhongJieZhe;         private int cinnt=0;         public Colleague2(ZhongJieZhe zhongJieZhe)         {             this.zhongJieZhe=zhongJieZhe;         }           public void hehe()           {               System.out.println("我是Colleague2类,中介者通知我有事情做了。我要去进货了,兄弟们");                             haha();                              zhongJieZhe.MakeSomebodyDoSomething("告诉他,我已经进货回来了,进了["+cinnt+"]个货");           }                      public void haha()           {               cinnt=10;           }                      public void DoOtherThings()           {               System.out.println("这是Colleague2类,我要做我自己的事情");           }  }
System.out.println();         System.out.println("************中介者模式************");         ZhongJieZhe zhongJieZhe=new ZhongJie();         Colleague1 colleague1=new Colleague1(zhongJieZhe);         Colleague2 colleague2=new Colleague2(zhongJieZhe);         zhongJieZhe.setCollegue1(colleague1);         zhongJieZhe.setCollegue2(colleague2);         colleague1.sub(1);         colleague1.DoOtherThings();         colleague1.sub(2);************中介者模式************销售成功 count=9这是Colleague1类,我要做我自己的事情销售成功 count=7先声明此次服务我中介者要收5我是Colleague2类,中介者通知我有事情做了。我要去进货了,兄弟们先声明此次服务我中介者要收6中介者告诉我进货成功了,我不知道谁进的货。管他呢!货好就行进货成功 count=17
    此示例中通过中介者来完成两个对象之间的交互。两个对象的交互比较简单、清晰。但是如果有n个对象之间发生交互,假如两两之间发生调用,则有n(n-1)中调用方式,类之间的关系十分复杂。通过中介者来完成多个对象之间的交互都通过中介者模式完成,从而将复杂的网络结构变成星型结构,使类间耦合变少,结构清晰。

    中介者模式的不足就是,过多的对象调用关系使中介者里面的逻辑复杂,如果中介者处理不过来就会变成瓶颈。所以中介者应该量力而为。



0 0
原创粉丝点击