Head First设计模式之中介者模式

一、定义

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

二、结构

组成:

  ● 抽象中介者(Mediator)角色:定义统一的接口用于各同事角色之间的通信,其中主要方法是一个(或多个)事件方法。

  ● 具体中介者(ConcreteMediator)角色:实现了抽象中介者所声明的事件方法。具体中介者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系。

  ● 抽象同事类(Colleague)角色:定义出中介者到同事角色的接口。同事角色只知道中介者而不知道其余的同事角色。与其他的同事角色通信的时候,一定要通过中介者角色协作。

  ● 具体同事类(ConcreteColleague)角色:所有的具体同事类均从抽象同事类继承而来。实现自己的业务,在需要与其他同事通信的时候,就与持有的中介者通信,中介者会负责与其他的同事交互。

代码结构

 //抽象中介者类
    public interface IMediator
    {
        /**
         * 同事对象在自身改变的时候来通知中介者的方法
         * 让中介者去负责相应的与其他同事对象的交互
         */
        void Changed(Colleague c);
    }

    //抽象同事类
    public abstract class Colleague
    {
        //持有一个中介者对象
        private IMediator _mediator;
        /**
         * 构造函数
         */
        public Colleague(IMediator mediator)
        {
            this._mediator = mediator;
        }
        /**
         * 获取当前同事类对应的中介者对象
         */
        public IMediator GetMediator()
        {
            return _mediator;
        }
    }

    //具体中介者类
    public class ConcreteMediator : IMediator
    {
        //持有并维护同事A
        private ConcreteColleagueA _colleagueA;
        //持有并维护同事B
        private ConcreteColleagueB _colleagueB;

        public void SetColleagueA(ConcreteColleagueA colleagueA)
        {
            this._colleagueA = colleagueA;
        }

        public void SetColleagueB(ConcreteColleagueB colleagueB)
        {
            this._colleagueB = colleagueB;
        }

        public void Changed(Colleague c)
        {
            /**
             * 某一个同事类发生了变化,通常需要与其他同事交互
             * 具体协调相应的同事对象来实现协作行为
             */
        }
    }

    //具体同事类
    public class ConcreteColleagueA : Colleague
    {

        public ConcreteColleagueA(IMediator mediator) : base(mediator)
        {
        }
        /**
         * 示意方法,执行某些操作
         */
        public void Operation()
        {
            //在需要跟其他同事通信的时候,通知中介者对象
            GetMediator().Changed(this);
        }
    }
    public class ConcreteColleagueB : Colleague
    {

        public ConcreteColleagueB(IMediator mediator) : base(mediator)
        {
        }
        /**
         * 示意方法,执行某些操作
         */
        public void Operation()
        {
            //在需要跟其他同事通信的时候,通知中介者对象
            GetMediator().Changed(this);
        }
    }

三、适用场景

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。

2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

应用实例

1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

2、机场调度系统。

3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

四、优缺点

  优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

  缺点:中介者会庞大,变得复杂难以维护。

五、实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPatterns.Mediator
{
    class Program
    {
        static void Main(string[] args)
        {
            MessageMediator mediator = new MessageMediator();

            ConcreteColleagueA a = new ConcreteColleagueA(mediator, "A");
            ConcreteColleagueB b = new ConcreteColleagueB(mediator, "B");
            ConcreteColleagueC c = new ConcreteColleagueC(mediator, "C");

            mediator.SetColleagueA(a);
            mediator.SetColleagueB(b);
            mediator.SetColleagueC(c);

            mediator.Chat(a, "中午吃啥饭?");
            Console.WriteLine("====");

            mediator.Chat(b, "我想吃刀削面");
            Console.WriteLine("====");

            mediator.Chat(c, "我也想吃刀削面");
            Console.WriteLine("====");

            mediator.Chat(a, "行,那中午一起去吃刀削面吧");
        }
    }

    //抽象中介者类
    public interface IMediator
    {
        void Chat(Colleague c, string message);
    }

    //抽象同事类
    public abstract class Colleague
    {
        private string name;
        //持有一个中介者对象
        private IMediator _mediator;

        public Colleague(IMediator mediator, string name)
        {
            this._mediator = mediator;
            this.name = name;
        }
        /**
         * 获取当前同事类对应的中介者对象
         */
        public IMediator GetMediator()
        {
            return _mediator;
        }

        /**
         * 获取昵称
         */
        public string getName()
        {
            return name;
        }

        /**
         * 接收消息
         */
        public abstract void receive(string message);

        /**
         * 发送消息
         */
        public abstract void send(string message);
    }

    //具体中介者类
    public class MessageMediator : IMediator
    {
        //持有并维护同事A
        private ConcreteColleagueA _colleagueA;
        //持有并维护同事B
        private ConcreteColleagueB _colleagueB;

        private ConcreteColleagueC _colleagueC;

        public void SetColleagueA(ConcreteColleagueA colleagueA)
        {
            this._colleagueA = colleagueA;
        }

        public void SetColleagueB(ConcreteColleagueB colleagueB)
        {
            this._colleagueB = colleagueB;
        }
        public void SetColleagueC(ConcreteColleagueC colleagueC)
        {
            this._colleagueC = colleagueC;
        }

        public void Chat(Colleague c, string message)
        {
            if (_colleagueA != null)
            {
                _colleagueA.send(message);
                _colleagueB.receive(message);
                _colleagueC.receive(message);
            }
            else if (_colleagueB != null) {
                _colleagueB.send(message);
                _colleagueA.receive(message);
                _colleagueC.receive(message);
            } else if (_colleagueC != null) {
                _colleagueC.send(message);
                _colleagueA.receive(message);
                _colleagueB.receive(message);
            }
        }
    }

    //具体同事类
    public class ConcreteColleagueA : Colleague
    {

        public ConcreteColleagueA(IMediator mediator, string name) : base(mediator, name)
        {
        }
        /**
         * 示意方法,执行某些操作
         */
        public void Operation(string message)
        {
            //在需要跟其他同事通信的时候,通知中介者对象
            GetMediator().Chat(this, message);
        }

        public override void receive(String message)
        {
            Console.WriteLine("【A】收到消息:【" + message + "】");
        }

        public override void send(String message)
        {
            Console.WriteLine("【A】发出消息:【" + message + "】");
        }
    }
    public class ConcreteColleagueB : Colleague
    {

        public ConcreteColleagueB(IMediator mediator, string name) : base(mediator, name)
        {
        }
        /**
         * 示意方法,执行某些操作
         */
        public void Operation(string message)
        {
            //在需要跟其他同事通信的时候,通知中介者对象
            GetMediator().Chat(this, message);
        }

        public override void receive(String message)
        {
            Console.WriteLine("【B】收到消息:【" + message + "】");
        }

        public override void send(String message)
        {
            Console.WriteLine("【B】发出消息:【" + message + "】");
        }
    }

    public class ConcreteColleagueC : Colleague
    {

        public ConcreteColleagueC(IMediator mediator, string name) : base(mediator, name)
        {
        }
        /**
         * 示意方法,执行某些操作
         */
        public void Operation(string message)
        {
            //在需要跟其他同事通信的时候,通知中介者对象
            GetMediator().Chat(this, message);
        }

        public override void receive(String message)
        {
            Console.WriteLine("【C】收到消息:【" + message + "】");
        }

        public override void send(String message)
        {
            Console.WriteLine("【C】发出消息:【" + message + "】");
        }
    }
}

结果

【A】发出消息:【中午吃啥饭?】
【B】收到消息:【中午吃啥饭?】
【C】收到消息:【中午吃啥饭?】
====
【A】发出消息:【我想吃刀削面】
【B】收到消息:【我想吃刀削面】
【C】收到消息:【我想吃刀削面】
====
【A】发出消息:【我也想吃刀削面】
【B】收到消息:【我也想吃刀削面】
【C】收到消息:【我也想吃刀削面】
====
【A】发出消息:【行,那中午一起去吃刀削面吧】
【B】收到消息:【行,那中午一起去吃刀削面吧】
【C】收到消息:【行,那中午一起去吃刀削面吧】

参考:

http://www.cnblogs.com/JsonShare/p/7263876.html

http://www.runoob.com/design-pattern/mediator-pattern.html

欢迎阅读本系列文章:Head First设计模式之目录

时间: 2024-08-11 09:55:30

Head First设计模式之中介者模式的相关文章

设计模式之中介者模式(Mediator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式之中介者模式20170731

行为型设计模式之中介者模式: 一.含义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 同事角色与其他同时角色通信的时候,一定要通过中介者角色(中介者封装了各个同事类之间的逻辑关系) 二.代码说明 1.主要有两个角色 1)中介者角色 通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色. 2)同事角色 每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作. 每个同事类的行为分

设计模式(中介者模式-对象去耦)

声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时使用中介者模式 1.对象间的交互虽定义明确然而非常复杂,导致椅子对象彼此相互依赖而且难以理解: 2.因为对象引用了许多其他对象并与其通信,导致对象难以复用: 3.想要制定一个分布在多个对象中的逻辑或行为,又不想生成太多子类. 举个例子 有三个视图,我们可能需要两两之间进行跳转,类比于公司内同时每两个人都有可能

【设计模式】——中介者模式

中介者模式(Mediator),用一个中介者对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象,Mediator是抽象中介者,定义了同事对象到中介者对象的接口,ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接

折腾Java设计模式之中介者模式

博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 通俗点来讲就是提供一个中介平台,说到平台,那其实很容易联系到我们很熟悉的房地产中介.我们可以直接通过这个平台得到我们想要的信息,不用对象自身与其他对象交互. 买房子租房子就不需要去找房东,只需要在中介那里获取相应的×××信息.如下图那样,两方只

设计模式之: 中介者模式

一.前言 平常我们写一个聊天软件,如果我们只是各个客户端之间连接聊天,那估计我们会写的想哭,那如果我们用服务器作为中间媒介,通过服务器来完成转发,群聊等客户端之间的连接,那样我们就可以最大程度的为各个客户端之间解耦,把它们之间的通信方法抽出来单独实现, 如图1就是不使用中介媒体的时候的结构图: 如图2就是使用我们所说的服务器作为中间媒介的情况的结构图: 二.中介模式 图二就是我们所说的中介模式! 在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装

大话设计模式_中介者模式(Java代码)

中介者模式:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 简单描述:1个抽象Colleague,其派生多个具体ConcreteColleague,每个具体ConcreteColleague都认识一个具体中介者.他们发送消息的时候是通过中介者发送.1个中介者,具体中介者认识所有的ConcreteColleague(即持有所有具体ConcreteColleague的引用),它提供向其他具体ConcreteColleag

Java 设计模式之中介者模式

本文继续23种设计模式系列之中介者模式. 定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 角色 抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信.一般包括一个或几个抽象的事件方法,并由子类去实现. 中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法.从一个同事类接收消息,然后通过消息影响其他同时类. 同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对

深入理解JavaScript系列(36):设计模式之中介者模式

介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要内容来自:http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript 正文 软件开发中,中介者是一个行为设计模式,通过提供一个统一的接口让系统的不同部分进行通信.一般,如果系统有很多子模块需要直接沟通,

【GOF23设计模式】中介者模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 1 package com.test.mediator; 2 /** 3 * 同事类的接口 4 */ 5 public interface Department { 6 void selfAction();//做本部门的事情 7 void outAction();//向总经理发出申请 8 } 1 package com.test.mediator; 2 3 public class