设计模式-22.中介者模式

mac2024-10-02  50

定义:用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

使用场景:一堆类需要相互通信构造蜘蛛网结构时,就需要使用中介者降低耦合

实现:定义中介者类,包含通信对象的实例,声明通信方法。定义通信对象抽象类,包含一个中介者类实例,声明通信方法,方法中调用中介者的通信方法,传参为消息+自己的引用。

优点:解耦通信者

缺点:中介者的类会变得很复杂

代码示例:联合国就是各个国家之间的中介

/**  * 联合国  */ public class UnitedNations {     private Country country1;          private Country country2;          public Country getCountry1() {         return country1;     }

    public void setCountry1(Country country1) {         this.country1 = country1;     }

    public Country getCountry2() {         return country2;     }

    public void setCountry2(Country country2) {         this.country2 = country2;     }

    public void forward(Country country,String message) {         if (country == country1) {             country2.getMessage(message);         }else {             country1.getMessage(message);         }     } }

public abstract class Country {     protected UnitedNations unitedNations;

    public Country(UnitedNations unitedNations) {         super();         this.unitedNations = unitedNations;     }          public abstract void send(String message);          public abstract void getMessage(String message); }

public class China extends Country {

    public China(UnitedNations unitedNations) {         super(unitedNations);     }     

    @Override     public void send(String message) {         this.unitedNations.forward(this, message);     }     @Override     public void getMessage(String message) {         System.out.println("china收到消息:"+message);     } }

public class USA extends Country {

    public USA(UnitedNations unitedNations) {         super(unitedNations);     }

    @Override     public void send(String message) {         this.unitedNations.forward(this, message);     }

    @Override     public void getMessage(String message) {         System.out.println("usa收到消息:"+message);     }

}

public class Main {

    public static void main(String[] args) {                  UnitedNations unitedNations = new UnitedNations();         China china = new China(unitedNations);         USA usa = new USA(unitedNations);         unitedNations.setCountry1(china);         unitedNations.setCountry2(usa);                  china.send("老实点");         usa.send("好嘞");     }

}

结果:

最新回复(0)