欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

简说设计模式——中介者模式

程序员文章站 2022-12-24 16:08:14
一、什么是中介者模式 中介这个词并不陌生,就是房屋中介的那个“中介”,就是中间人的意思。比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用。 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者 ......

一、什么是中介者模式

  中介这个词并不陌生,就是房屋中介的那个“中介”,就是中间人的意思。比如mvc模式,c(controller控制器)是m(model模型)和v(view视图)的中介者,在前后端交互时起到了中间人的作用。

  中介者模式(mediator),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。uml结构图如下:

简说设计模式——中介者模式

  其中,mediator是抽象中介者,定义了同事对象到中介者对象的接口;colleague是抽象同事类;concretemediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令;concretecolleague是具体同事类,每个具体同事只知道自己的行为,而不了解其它同事类的情况,但它们却都认识中介者对象。

  1. 抽象中介者

  抽象中介者角色定义统一的接口,用于各同事角色之间的通信。

1 public abstract class mediator {
2     
3     //抽象的发送消息方法
4     public abstract void send(string message, colleague colleague);
5     
6 }

  2. 抽象同事类

  每一个同事角色都知道中介者角色,而且与其它的同事角色通信的时候,一定要通过中介者角色协作。每个同事类的行为分两种:一种是同事本身行为,比如改变对象本身的状态,处理自己的行为等,这种行为叫做自发行为,与其它同事类或者中介者没有任何依赖;第二种是必须依赖中介者才能完成的行为,叫做依赖方法。

1 public abstract class colleague {
2     
3     protected mediator mediator;
4     
5     public colleague(mediator mediator) {
6         this.mediator = mediator;
7     }
8 
9 }

  3. 具体中介者类

  具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色。

 1 public class concretemediator extends mediator {
 2 
 3     private concretecolleague1 colleague1;
 4     private concretecolleague2 colleague2;
 5     
 6     public void setcolleague1(concretecolleague1 colleague1) {
 7         this.colleague1 = colleague1;
 8     }
 9 
10     public void setcolleague2(concretecolleague2 colleague2) {
11         this.colleague2 = colleague2;
12     }
13 
14     @override
15     public void send(string message, colleague colleague) {
16         if(colleague == colleague1) {
17             colleague2.notify(message);
18         } else {
19             colleague1.notify(message);
20         }
21     }
22 
23 }

  4. 具体同事类

  这里以concretecolleague1为例,concretecolleague2不再赘述。

 1 public class concretecolleague1 extends colleague {
 2 
 3     public concretecolleague1(mediator mediator) {
 4         super(mediator);
 5     }
 6     
 7     public void send(string message) {
 8         mediator.send(message, this);
 9     }
10     
11     public void notify(string message) {
12         system.out.println("同事1得到消息:" + message);
13     }
14 
15 }

  5. client客户端

  首先创建一个具体中介者对象,然后实例化两个具体同事类并与该中介者进行绑定,colleague1与colleague2通过中介者发送信息。

 1 public class client {
 2     
 3     public static void main(string[] args) {
 4         concretemediator mediator = new concretemediator();
 5         
 6         concretecolleague1 colleague1 = new concretecolleague1(mediator);
 7         concretecolleague2 colleague2 = new concretecolleague2(mediator);
 8         
 9         mediator.setcolleague1(colleague1);
10         mediator.setcolleague2(colleague2);
11         
12         colleague1.send("nice to meet u.");
13         colleague2.send("nice to meet u too.");
14     }
15 
16 }

  运行结果如下:
  简说设计模式——中介者模式

二、中介者模式的应用

  1. 何时使用

  • 多个类相互耦合,形成网状结构时

  2. 方法

  • 将网状结构分离为星型结构

  3. 优点

  • 减少类间依赖,降低了耦合
  • 符合迪米特原则

  4. 缺点

  • 中介者会膨胀的很大,而且逻辑复杂

  5. 使用场景

  • 系统中对象之间存在比较复杂的引用关系
  • 想通过一个中间类来封装多个类的行为,而又不想生成太多的子类

  6. 应用实例

  • 联合国/wto作为中介者协调各个国家
  • 房屋中介/机场调度系统
  • mvc框架,其中c(contorller控制器)是m(model模型)和v(view视图)的中介者

  7. 注意事项

  • 不应当在职责混乱时使用

三、中介者模式的实现

  上面我们有提到,联合国作为一个由各国代表组成,用来维护国际和平与安全,解决国际间经济、社会、文化和人道主义性质的问题的角色,它就是一个调停者、中介者的角色,国与国直接完全完全可以通过“联合国”这个中介者来发生关系,而不用直接通信。

  下面就以联合国安理会作为中介者,了解一下中介者模式。uml图如下:

简说设计模式——中介者模式

  1. 联合国机构

  抽象中介者。

1 public abstract class unitednations {
2     
3     public abstract void declare(string message, country country);
4 
5 }

  2. 国家类

  抽象国家类,需声明中介者角色。

1 public class country {
2     
3     protected unitednations unitednations;
4     
5     public country(unitednations unitednations) {
6         this.unitednations = unitednations;
7     }
8 
9 }

  3. 具体国家类

  具体国家类,继承了抽象国家类。这里以usa类为例,iraq类不再赘述。

 1 public class usa extends country {
 2 
 3     public usa(unitednations unitednations) {
 4         super(unitednations);
 5     }
 6     
 7     public void declare(string message) {
 8         unitednations.declare(message, this);
 9     }
10     
11     public void getmessage(string message) {
12         system.out.println("美国获得对方信息:" + message);
13     }
14 
15 }

  4. 联合国安理会

  具体中介者角色,继承抽象中介者,重写其declare()方法,对不同国家发送不同信息。

 1 public class unitednationssecuritycouncil extends unitednations {
 2 
 3     private usa usa;
 4     private iraq iraq;
 5     
 6     public void setusa(usa usa) {
 7         this.usa = usa;
 8     }
 9 
10     public void setiraq(iraq iraq) {
11         this.iraq = iraq;
12     }
13 
14     @override
15     public void declare(string message, country country) {
16         if(country == usa) {
17             iraq.getmessage(message);
18         } else {
19             usa.getmessage(message);
20         }
21     }
22 
23 }

  5. client客户端

  实例化一个联合国安理会对象,两国通过联合国安理会进行对话。

 1 public class client {
 2 
 3     public static void main(string[] args) {
 4         
 5         unitednationssecuritycouncil unsc = new unitednationssecuritycouncil();
 6         
 7         usa usa = new usa(unsc);
 8         iraq iraq = new iraq(unsc);
 9         
10         unsc.setusa(usa);
11         unsc.setiraq(iraq);
12         
13         usa.declare("不准研制核武器");
14         iraq.declare("我们没有核武器");
15     }
16 
17 }

  运行结果如下:

  简说设计模式——中介者模式

 

  源码地址:https://gitee.com/adamjiangwh/gof