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

    在结构型设计模式中,有一个外观/门面(Facade)模式,它的作用是降低客户类与子系统内部各类的交互,相当于一个传达室,有客人来时直接与传达室交互,然后由传达室去系统内部为客人办理各种事务,这里中介者也起到类似的作用,但是它是在系统内部各个部门交流的枢纽,也即是说,系统内部不同部门之间就不要直接交互了,有消息传达的话都经过这个中介者帮它们去完成。GOF对Mediator的定义是:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们

    之间的交互。 下图是中介者模式的结构图:

    中介者模式中,各个类的交互关系如下图表示:

    也就是说,中介者对象是一组需要相互通信的对象的信息传达人,所有需要与其他对象通信的对象可以将信息传给中介者,然后由中介者帮它传信。根据上图可以得出如下代码:

     1 abstract class Colleague{
     2     private Mediator mediator;
     3     public Colleague(Mediator m){
     4         mediator=m;
     5     }
     6     public Mediator getMediator(){
     7         return mediator;
     8     }
     9     public abstract void action();
    10     public void change(){
    11         mediator.colleagueChanged(this);
    12     }
    13 }    
    14 class Colleague1 extends Colleague{
    15     public Colleague1(Mediator m){
    16         super(m);
    17     }
    18     public void action(){
    19         System.out.println("this is Colleague1::action()");
    20     }
    21     public String toString(){
    22         return "colleague1";
    23     }
    24 }
    25 class Colleague2 extends Colleague{
    26     public Colleague2(Mediator m){
    27         super(m);
    28     }
    29     public void action(){
    30         System.out.println("this is Colleague2::action()");
    31     }
    32     public String toString(){
    33         return "colleague2";
    34     }
    35 }    
    36 abstract class Mediator{
    37     public abstract void colleagueChanged(Colleague c);
    38     protected abstract void createConcreteColleague();
    39 }
    40 class ConcreteMediator extends Mediator{
    41     private Colleague1 colleague1;
    42     private Colleague2 colleague2;
    43     public void colleagueChanged(Colleague c){
    44         System.out.println("发生改变的对象是:"+c);
    45         c.action();
    46         if(c==colleague1){
    47             System.out.println("这里可以通知其他colleague执行相关任务,而不需要 "+c+" 本身去做通知");
    48             System.out.println("例如,通知colleague2做一些事情");
    49             colleague2.action();
    50         }
    51     }
    52     protected void createConcreteColleague(){
    53         colleague1=new Colleague1(this);
    54         colleague2=new Colleague2(this);
    55     }
    56     public Colleague1 getColleague1(){
    57         return colleague1;
    58     }
    59     public Colleague2 getColleague2(){
    60         return colleague2;
    61     }
    62 }
    63     
    64 public class Test{
    65     public static void main(String[] args) {
    66         ConcreteMediator cm=new ConcreteMediator();
    67         cm.createConcreteColleague();
    68         Colleague1 c1=cm.getColleague1();
    69         Colleague2 c2=cm.getColleague2();
    70         cm.colleagueChanged(c1);
    71     }
    72 }
    View Code

    中介者模式的优点是:

     1) 减少了子类生成Mediator将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Mediator的子类即可。这样各个 Colleague类可被重用。

    2) 它将各Colleague解耦 Mediator有利于各Colleague间的松耦合. 你可以独立的改变和复用各Colleague类和Mediator类。

    显著的缺点是:

    它使控制集中化 中介者模式将交互的复杂性变为中介者的复杂性。 它比任何一个Colleague都复杂,这可能使得中介者自身成为一个难于维护的庞然大物。

     

  • 相关阅读:
    C#中使用$"{}"替换string.Format()
    js==>id-pid转children【】树结构数据
    React使用模板
    C#--fetch配置使用
    ...扩展运算符解释
    java之死锁
    Stream流
    lambda 之 forEach( ->{} )
    java基础之递归(九九乘法表)
    java读取 .xlsx格式文件转成list
  • 原文地址:https://www.cnblogs.com/codeMedita/p/7374408.html
Copyright © 2011-2022 走看看