16. Mediator 中介者模式           2008-09-09

动机(Motivation)

在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。

在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

意图(Intent)

用一个中介对象来封装一系列的对象交互。

中介者使各对象不需要显式的相互引用,从而使其耦合松散而且,可以独立地改变它们之间的交互。             ——《设计模式》GoF

基本代码:
    //抽象中介者,定义了同事对象到中介者对象的接口
    abstract class Mediator
    {
        public abstract void Send(string message, Colleague colleague);
    }
//具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接受消息,向具体同事对象发出命令
class ConcreteMediator : Mediator
{
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

public ConcreteColleague1 Colleague1
    {
        set { colleague1 = value; }
    }

public ConcreteColleague2 Colleague2
    {
        set { colleague2 = value; }
    }

public override void Send(string message, Colleague colleague)
    {
        if (colleague == colleague1)
        {
            colleague2.Notify(message);
        }
        else
        {
            colleague1.Notify(message);
        }
    }
}

    //抽象同事类
    abstract class Colleague
    {
        protected Mediator mediator;

public Colleague(Mediator mediator)
        {
            this.mediator = mediator;
        }
    }

//具体同事类1,具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象
class ConcreteColleague1 : Colleague
{
    public ConcreteColleague1(Mediator mediator)
        : base(mediator)
    {

}

public void Send(string message)
    {
        mediator.Send(message, this);
    }

public void Notify(string message)
    {
        Console.WriteLine("同事1得到信息:" + message);
    }
}

//具体同事类2,具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象
class ConcreteColleague2 : Colleague
{
    public ConcreteColleague2(Mediator mediator)
        : base(mediator)
    {
    }

public void Send(string message)
    {
        mediator.Send(message, this);
    }

public void Notify(string message)
    {
        Console.WriteLine("同事2得到信息:" + message);
    }
}

客户端代码:
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteMediator m = new ConcreteMediator();

ConcreteColleague1 c1 = new ConcreteColleague1(m);
            ConcreteColleague2 c2 = new ConcreteColleague2(m);

m.Colleague1 = c1;
            m.Colleague2 = c2;

c1.Send("吃过饭了吗?");
            c2.Send("没有呢,你打算请客?");

Console.Read();
        }
    }

Mediator的几个要点:

将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。

随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。

Façade模式是解耦系统外到系统内(单向)的对象关联关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。

转载于:https://www.cnblogs.com/MaoBisheng/archive/2008/09/10/1288577.html

设计模式笔记 16. Mediator 中介者模式(行为型模式)相关推荐

  1. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  2. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  3. 23种设计模式----中介者模式----行为型模式

    中介者模式 1.什么是中介者模式 2.中介者模式的角色 3.例子 3.1 项目结构 3.2 共同实体 3.3 抽象的中介者 3.4 抽象的被中介者 3.5 具体的中介者 3.6 具体的被中介者 3.7 ...

  4. GOF23设计模式-创建型模式4-原型模式

    设计模式GOF23-原型模式 思考 原型模式 原型模式实现 克隆绵羊多利(浅拷贝) 克隆绵羊多利(深拷贝) 利用序列化和反序列化技术实现深克隆 何时使用? 测试new与clone创建对象效率 思考 克 ...

  5. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  6. C++设计模式之工厂模式(创建型模式)

    学习软件设计,向OO高手迈进! 设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案. 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来 ...

  7. 23种设计模式----原型模式----创建型模式

    原型模式 1.1什么是原型模式 1.2为什么要使用原型模式 2.原型模式的解释 3.例子 3.1例子将要实现的目标 3.2例子设计 3.3原型类 3.4具体实现的3个原型实例类 3.5管理类 3.6工 ...

  8. java 23种设计模式详尽分析与实例解析_Java 23种设计模式详尽分析与实例解析之一--创建型模式...

    模式分析:在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做.这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,使得工厂方法模式允许 ...

  9. 建造者模式与原型模式/builder模式与prototype模式/创建型模式

    建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...

最新文章

  1. 用Micro:bit做浇灌系统
  2. jsp中${}解析不了
  3. 支付宝及时到账(新版)配置
  4. 【Flink】checkpoint storage at checkckpoint coordinator No route host from xx to xx:9000
  5. 微软将取缔 8 亿 Windows 10 用户的密码!
  6. jquery 2.0.3代码结构
  7. Apache Tika源码研究(三)
  8. python输入两个坐标求距离_python计算两个地址之间的距离方法
  9. Payoneer(P卡)怎么免费申请Joom账号?
  10. HTML+CSS面试试题(部分)
  11. 【UER #4】量子态的棋盘
  12. 【电脑新硬盘如何分区】
  13. android 左测设置功能,iqoo手机左边按键有什么作用?iqoo手机左侧按键介绍
  14. 人工智能可以像人类一样学习吗?
  15. DPCRN: Dual-Path Convolution Recurrent Network for Single Channel Speech Enhancement---论文翻译
  16. Kylin快速入门系列(2) | Kylin的快速入门
  17. 金融时间序列分析——学习金融时间序列之间的时序关系
  18. spring ioc容器创建过程-整体流程
  19. 盗版软件繁荣了IT业 害死了软件业
  20. JMM、Volatile及单例模式解析

热门文章

  1. strtotime php,php strtotime函数怎么用
  2. 用python让excel飞起来 pdf_讯飞智能键盘K710 一款无网络实力依然在线的黑科技产品...
  3. html新增的选择器,HTML5新增的选择器
  4. python3 mysqldb查询_python3 pymysql查询结果包含字段名
  5. linux c语言 utf8读写,关于在C程序中处理UTF-8文本的方法详解
  6. android 创建图片,[Android]创建图片
  7. css动漫效果库,Animate.css功能强大的纯CSS3动画库 - 资源分享
  8. mysql字段简索引_3万字总结,Mysql优化之精髓
  9. 微信小程序引用php函数,微信小程序Page中data数据操作和函数调用详细介绍
  10. shell信息查看脚本linux,每次登录Shell时使用shell脚本查看Linux上的系统信息