JAVA 设计模式 中介者模式

用途

中介者模式 (Mediator)

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

中介者模式是一种行为型模式

结构

图-中介者模式结构图

Mediator : 为 Colleague 对象定义一个交流接口。

abstract class Mediator {
 public abstract void Send(String message, Colleague colleague);
 }

ConcreteMediator : 实现 Mediator 中的交流接口。 这个类中需要了解并维护所有的 colleague 对象。

class ConcreteMediator extends Mediator {
 private ConcreteColleague1 colleague1;
 private ConcreteColleague2 colleague2;
 
 public void setColleague1(ConcreteColleague1 colleague1) {
 this.colleague1 = colleague1;
     }
 
 public void setColleague2(ConcreteColleague2 colleague2) {
 this.colleague2 = colleague2;
     }
 
     @Override
 public void Send(String message, Colleague colleague) {
 if (colleague == colleague1) {
             colleague2.Notify(message);
         } else if (colleague == colleague2){
             colleague1.Notify(message);
         } else {
             System.out.println("Error!");
         }
     }
 }

Colleague组 : 每个 Colleague 对象应该知道它的 Mediator 对象,但不知道其他同事对象。它只能联系 Mediator 对象。

abstract class Colleague {
 protected Mediator mediator;
 
 public Colleague(Mediator mediator) {
 this.mediator = mediator;
     }
 
 public void Send(String message) {
         mediator.Send(message, this);
     }
 
 public abstract void Notify(String message);
 }
 
 class ConcreteColleague1 extends Colleague {
 public ConcreteColleague1(Mediator mediator) {
 super(mediator);
     }
 
     @Override
 public void Notify(String message) {
         System.out.println("同事1得到信息:" + message);
     }
 }
 
 class ConcreteColleague2 extends Colleague {
 public ConcreteColleague2(Mediator mediator) {
 super(mediator);
     }
 
     @Override
 public void Notify(String message) {
         System.out.println("同事2得到信息:" + message);
     }
 }

测试代码

public class MediatorPattern {
 public static void main(String[] args) {
         ConcreteMediator mediator = new ConcreteMediator();
         ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
         ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
 
         mediator.setColleague1(colleague1);
         mediator.setColleague2(colleague2);
 
         colleague1.Send("How are you?");
         colleague2.Send("Fine, thank you. And you?");
         colleague1.Send("I'm fine. Thankes.");
     }
 }

运行结果

 同事2得到信息:How are you?
 同事1得到信息:Fine, thank you. And you?
 同事2得到信息:I'm fine. Thankes.

应用场景

中介者模式一般用于定义良好但是交互较为负责的对象集合。产生的相互依赖关系是无结构化的并且难以理解。

和很多其他对象有引用关系以及交互的对象很难被重用。

想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户画像

第18章 IP协议

1.因特网使用的IP协议是无连接的,因此其传输时不可靠的。之所以这样设计,是因为这样可以使计算机网络便宜,灵活,如果像电信网...

883
来自专栏北京马哥教育

4KB 扇区磁盘上的 Linux:实际建议

为何更改为 4096 字节扇区? 如果您熟悉磁盘结构,就知道磁盘是被分解成扇区 的,大小通常是 512 字节;所有读写操作均在成倍大小的扇区中进行。仔细查看,就...

3048
来自专栏木可大大

RAID技术

RAID 的两个关键目标是提高数据可靠性和 I/O 性能。磁盘阵列中,数据分散在多个磁盘中,然而对于计算机系统来说,就像一个单独的磁盘。通过把相同数据同时写入到...

42323
来自专栏黑白安全

通过F5获取服务器真实内网IP

渗透测试过程中,经常会遇到目标服务器使用F5 LTM做负载均衡。 如果能获取到目标服务器的真实IP地址,会给后续渗透带来一定便利。

904
来自专栏禁心尽力

总结切面编程AOP的注解式开发和XML式开发

       有段日子没有总结东西了,因为最近确实有点忙,一直在忙于hadoop集群的搭建,磕磕碰碰现在勉强算是能呼吸了,因为这都是在自己的PC上,资源确实有点...

22810
来自专栏

后端开源软件集合

缓存系统:memcached(group cache)、redis、mongodb、Couchbase(CouchDB、Membase、CouchOne) ht...

1829
来自专栏温安适的blog

2个小bug,有点小门道

2584
来自专栏北京马哥教育

记一次内存占用问题的调查过程

马哥linux运维 | 最专业的linux培训机构 ---- 最近在维护一台CentOS服务器的时候,发现内存无端"损失"了许多,free和ps统计的结果相差...

3164
来自专栏杨建荣的学习笔记

假期前的数据库检查脚本之主备关系(r11笔记第46天)

快过年了,很多系统都要进入最后的检查和复验阶段,一方面在节假日前,提前发现问题总比过节的时候发现要好。另一方面如果出现故障的时候能及时进行处理,这个时候我们就需...

27510
来自专栏Golang语言社区

KCP-GO源码解析

ARQ:自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一. RTO:Retransmissio...

2613

扫码关注云+社区