第二十五章 中介者模式

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

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

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

应用场景:一般应用于一组对象以定义良好但是复杂的方式进行通信的场合;以及想定义一个分布在多个类中的行为,而又不想生成太多子类的场合。

/**
 * Created by hero on 16-4-11.
 */
public abstract class Mediator {
    public abstract void send(String message, Colleague colleague);
}
/**
 * Created by hero on 16-4-11.
 */
public class ConcreteMediator extends Mediator {
    private ConcreteColleague1 concreteColleague1;
    private ConcreteColleague2 concreteColleague2;

    @Override
    public void send(String message, Colleague colleague) {
        if (colleague instanceof ConcreteColleague1) {
            concreteColleague2.notify(message);
        } else {
            concreteColleague1.notify(message);
        }
    }

    public ConcreteColleague1 getConcreteColleague1() {
        return concreteColleague1;
    }

    public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
        this.concreteColleague1 = concreteColleague1;
    }

    public ConcreteColleague2 getConcreteColleague2() {
        return concreteColleague2;
    }

    public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
        this.concreteColleague2 = concreteColleague2;
    }
}
/**
 * Created by hero on 16-4-11.
 */
public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}
/**
 * Created by hero on 16-4-11.
 */
public class ConcreteColleague1 extends Colleague {
    public void send(String message) {
        mediator.send(message, this);
    }

    public void notify(String message) {
        System.out.println("colleague 1 receives message: " + message);
    }

    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }
}
/**
 * Created by hero on 16-4-11.
 */
public class ConcreteColleague2 extends Colleague {
    public void send(String message) {
        mediator.send(message, this);
    }

    public void notify(String message) {
        System.out.println("colleague 2 receives message: " + message);
    }

    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }
}
public class Main {

    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(mediator);
        mediator.setConcreteColleague1(concreteColleague1);
        mediator.setConcreteColleague2(concreteColleague2);
        concreteColleague1.send("吃了吗?");
        concreteColleague2.send("没,你请客?");
    }
}
时间: 2024-07-30 20:27:20

第二十五章 中介者模式的相关文章

Gradle 1.12用户指南翻译——第二十五章. Scala 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前

“全栈2019”Java多线程第二十五章:生产者与消费者线程详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第二十五章:生产者与消费者线程详解 下一章 "全栈2019"Java多线程第二十六章:同步方法生产者与消费者线程 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"

第二十五章 springboot + hystrixdashboard

注意: hystrix基本使用:第十九章 springboot + hystrix(1) hystrix计数原理:附6 hystrix metrics and monitor 一.hystrixdashboard 作用: 监控各个hystrixcommand的各种值. 通过dashboards的实时监控来动态修改配置,直到满意为止 仪表盘: 二.启动hystrix 1.下载standalone-hystrix-dashboard-1.5.3-all.jar https://github.com/

C#图解教程 第二十五章 其他主题

其他主题 概述字符串使用 StringBuilder类把字符串解析为数据值关于可空类型的更多内容 为可空类型赋值使用空接合运算符使用可空用户自定义类型 Main 方法文档注释 插入文档注释使用其他XML标签 嵌套类型 嵌套类的示例可见性和嵌套类型 析构函数和dispose模式 标准dispose模式比较构造函数和析构函数 和COM的互操作 其他主题 概述 在本章中,我会介绍使用C#时的一些重要而又不适合放到其他章节的主题,包括字符串操作.可空类型.Main方法.文档注释以及嵌套类型. 字符串 对

WP8.1学习系列(第二十五章)——控件样式

XAML 框架提供许多自定义应用外观的方法.通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual Basic 的 Windows 运行时应用的路线图 使用 C++ 的 Windows 运行时应用的路线图 应用功能大全系列中突出显示的 Windows 应用商店应用 UI 详细信息 本主题包含下列部分: 先决条件 样式基础知识 应用隐式或显式样式 使用基于样式 使用工具轻松处理样式 修改 Windo

【读书笔记】C#高级编程 第二十五章 事务处理

(一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. 1.事务处理阶段 激活阶段:在这个阶段创建事务. 准备阶段:在这个阶段,每个资源管理器都可以定义事务的结果. 提交阶段:当所有的资源管理器都成功准备好了,就开始这个阶段. 2.ACID属性 事务的特征可以用术语ACID来定义: Atomicity(原子性):表示一个工作单元. Consistenc

奋斗吧,程序员——第二十五章 酒酣胸胆尚开张,鬓微霜,又何妨

冬日的清晨,天已经亮的很晚,呼一口新鲜空气,困意顿消. 街上还没有什么行人,卖早餐的铺子已经支起铺门,我就着热腾腾的豆浆吃了根油条下去,感觉身上有了些暖意. 昨晚一夜几乎没怎么睡着,因为天气乍冷,小涵一直缩在我怀里,搞得我"鸡冻"不已. 无意间碰到她的胸前,迷迷糊糊中我好像听到她问"是不是很想啊?" (70.80后普遍性压抑,包括我,小时候看到杂志里出现"乳房"这样的字眼都会激动不已,以至于现在的我,对使用"乳房"这样的词也颇

第二十五章 nullptr

早在 1972 年,C语言诞生的初期,常数 0 带有常数及空指针的双重身分. C 使用 preprocessor macro NULL 表示空指针, 让 NULL 及 0 分别代表空指针及常数 0. NULL 可被定义为((void*)0) 或是 0. C++ 并不采用 C 的规则,不允许将 void* 隐式转换为其他类型的指针. 为了使代码 char* c = NULL; 能通过编译,NULL 只能定义为 0. 这样的决定使得函数重载无法区分代码的语义: 1 void foo(char *);

第二十五章.类型转换

来源 位运算符 位取反运算符 位与运算符 位或运算符 左移/右移运算符 无符号整形的移位操作 有符号整形的移位操作 溢出运算符 值的上溢出 值的下溢出 有符号溢出 除零溢出 运算符函数 比较运算符 自定义运算符 自定义运算符的优先级和结合性 位运算符 位操作符通常在诸如图像处理和创建设备驱动等底层开发中使用,使用它可以单独操作数据结构中原始数据的比特位.在使用一个自定义的协议进行通信的时候,运用位运算符来对原始数据进行编码和解码也是非常有效的. 位取反运算符 按位取反运算符~对一个操作数的每一位