博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模式21.中介者模式-Java
阅读量:4035 次
发布时间:2019-05-24

本文共 2943 字,大约阅读时间需要 9 分钟。

1.定义

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

  • 将一个系统分割成许多对象通常可以增加复用性,但是对象间相互连接的激增又会降低其可复用性。
  • 因为大量的连接使得一个对象不可能再没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以对系统的行为进行任何较大的改动就十分困难。

2.基本代码

在这里插入图片描述

(1)抽象中介者类

package designmode.mediator;public abstract  class Mediator {
//抽象,得到同事对象以及发送信息 public abstract void Send(String message,Colleague colleague);}

(2)抽象同事类

package designmode.mediator;public class Colleague {
protected Mediator mediator; public Colleague(Mediator mediator){
this.mediator=mediator; }}

(3)具体中介者类

package designmode.mediator;public class ConcreteMediator extends Mediator{
private ConcreteColleague1 concreteColleague1; public ConcreteColleague2 concreteColleague2; public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1; } public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2; } //根据对象做出选择判断,通知对象 这里是重点 @Override public void Send(String message, Colleague colleague) {
if(colleague==concreteColleague1){
concreteColleague2.Notify(message); }else{
concreteColleague1.Notify(message); } }}

(4)具体同事类

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

(5)客户端

package designmode.mediator;public class Client {
public static void main(String[] args) {
ConcreteMediator concreteMediator=new ConcreteMediator(); ConcreteColleague1 c1=new ConcreteColleague1(concreteMediator); ConcreteColleague2 c2=new ConcreteColleague2(concreteMediator); concreteMediator.setConcreteColleague1(c1); concreteMediator.setConcreteColleague2(c2); c1.Send("吃饭了没?"); c2.Send("没有呢,一起去?"); }}

测试结果

同事2得信息:吃饭了没?同事1得信息:没有呢,一起去?Process finished with exit code 0

3.优缺点,应用场合

  • 中介者需要直到所有的具体同事类,责任太大

  • 中介者模式很容易在系统中应用,也容易误用,当系统出现‘多对多’交互复杂的对象群时,不要急于使用,而是首先反思系统在系统上的设计是否合理。

    优点

    • Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator.
    • 由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象从对象各自本身的行为转移到他们之间的交互上来,也就是站在了一个更宏观的角度去看待系统。

缺点

  • 由于ConcreteMediator控制了集中化,于是把交互复杂性变为了中介者的复杂性,这就是使得中介者会变得比任何一个ConcreteColleague都复杂。

应用场合

一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。

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

转载地址:http://zxfdi.baihongyu.com/

你可能感兴趣的文章
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>