zoukankan      html  css  js  c++  java
  • 中介者模式

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

    UML图:

      Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但他们却都认识中介者对象,Mediator是抽象中介者,定义了同时对象到中介者对象的接口,Concretemediator是具体中介者对象,实现抽象类的方法,他需要知道所有具体同事类,并从具体同事接受消息,向具体同事对象发出命令。

    代理示例如下:

    1 //抽象同事类
    2 public abstract class Colleague {
    3     protected Mediator mediator;
    4     
    5     //构造方法,得到中介者对象
    6     public Colleague(Mediator mediator){
    7         this.mediator = mediator;
    8     }
    9 }
     1 //ConcreteColleague2同事类
     2 public class ConcreteColleague1 extends Colleague{
     3 
     4     public ConcreteColleague1(Mediator mediator) {
     5         super(mediator);
     6     }
     7     
     8     public void send(String message){
     9         //发送信息时通常是中介者发送出去的
    10         mediator.send(message, this);
    11     }
    12     
    13     public void inform(String message){
    14         System.out.println("同事1得到信息:"+message);
    15     }
    16 
    17 }
     1 //ConcreteColleague2同事类
     2 public class ConcreteColleague2 extends Colleague{
     3 
     4     public ConcreteColleague2(Mediator mediator) {
     5         super(mediator);
     6     }
     7     
     8     public void send(String message){
     9         //发送信息时通常是中介者发送出去的
    10         mediator.send(message, this);
    11     }
    12     
    13     public void inform(String message){
    14         System.out.println("同事2得到信息:"+message);
    15     }
    16 
    17 }
    1 //Mediator类,抽象中介者类
    2 public abstract class Mediator {
    3     //定义一个抽象的发送消息的方法,得到同事对象和发送信息
    4     public abstract void send(String message,Colleague colleague);
    5 }
     1 //ConcreteMediator类,具体中介者类
     2 public class ConcreteMediator extends Mediator {
     3     private ConcreteColleague1 colleague1;
     4     private ConcreteColleague2 colleague2;
     5     
     6     public void setColleague1(ConcreteColleague1 colleague1) {
     7         this.colleague1 = colleague1;
     8     }
     9     public void setColleague2(ConcreteColleague2 colleague2) {
    10         this.colleague2 = colleague2;
    11     }
    12 
    13     //重写发送信息的方法,根据对象做出选择判断,通知对象
    14     @Override
    15     public void send(String message, Colleague colleague) {
    16         if(colleague==colleague1){
    17             colleague2.inform(message);//同事1要转告给同事2的消息
    18         }else{
    19             colleague1.inform(message);//同事2要回复同事1的消息
    20         }
    21     }
    22 
    23 }

    客户端测试代码:

     1 //客户端
     2 public class TestClient {
     3     public static void main(String[] args) {
     4         ConcreteMediator m = new ConcreteMediator();
     5         
     6         //让两个具体同事类认识中介者对象
     7         ConcreteColleague1 c1 = new ConcreteColleague1(m);
     8         ConcreteColleague2 c2 = new ConcreteColleague2(m);
     9         
    10         //让中介者认识各个具体同事类对象
    11         m.setColleague1(c1);
    12         m.setColleague2(c2);
    13         
    14         //具体同事类对象的发送信息都是通过中介者转发
    15         c1.send("吃过饭了吗?");//同事1问同事2
    16         c2.send("没有呢,你打算请客?");//同事2回答同事1
    17     }
    18 }

    运行结果:

      同事2得到信息:吃过饭了吗?
      同事1得到信息:没有呢,你打算请客?

  • 相关阅读:
    android studio 各种问题
    关于Android开发中Arm、X86和Mips(草稿)
    每日更新
    Error creating bean with name 'userRepository': Invocation of init method failed;
    API 'variant.getJavaCompiler()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()'
    increase the minSdkVersion to 26
    Exception thrown on Scheduler.Worker thread. Add `onError` handling
    M600 Pro 安装问题解决
    Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed.
    大疆无人机M100相关问题解决过程
  • 原文地址:https://www.cnblogs.com/lixianyuan-org/p/9537710.html
Copyright © 2011-2022 走看看