设计模式 之 中介者

中介者模式(Mediator)

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

腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件。标志是一只戴着红色围巾的小企鹅。QQ注册用户由1999年的2人(马化腾和张志东)到现在已经发展到上亿用户,2014年4月11日21点11分在线人数突破两亿,如今已成为腾讯公司的代表之作,是中国目前使用最广泛的交流软件。

我们都知道用QQ能够点对点地跟别人聊天,也能在讨论组或者QQ群里面一人一句的聊天,如果点对点的聊天是每个人即作为服务器也作为客户端,发送消息和接收消息的话。那多人聊天采用这种结构就会相当的复杂,那我们该怎么办呢?加入一个中介者角色,充当通信服务器,每个人都作为客户端与服务器通信。下面我们就来看看具体实现:

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

namespace Mediator
{
    //用户接口
    public interface IUser
    {
        //接收消息
        void receiveMessage(String message);
        //发送消息
        void sendMessage(String message);
        //获得发送的消息内容
        string getMessage();
    }

    //中介者接口
    public interface IMediator
    {
        //注册用户信息
        void regist(IUser user);
        //发送消息给所有人
        void notifyAllMessage(IUser user);

    }
    public class ConcreteMediator : IMediator
    {
        private IList<IUser> list = new List<IUser>();

        public void regist(IUser user)
        {
            if (user!=null && !list.Contains(user)){
                list.Add(user);
            }
        }
        public void notifyAllMessage(IUser user)
        {
            for (int i = 0; i < list.Count; i++)
            {
                if (!list[i].Equals (user))
                {
                    list[i].receiveMessage(user.getMessage());

                }
            }
        }
    }

    //抽象用户信息
    public abstract class AbstractUser : IUser
    {
        protected IMediator mediator;
        protected String name;
        protected String message;

        public AbstractUser(IMediator mediator, string name)
        {
            this.mediator = mediator;
            this.name = name;
        }
        public void sendMessage(String message)
        {
            this.message = message;
            Console.WriteLine(this.name + " 说:" + this.message);
            mediator.notifyAllMessage(this);
        }
        public abstract void receiveMessage(string message);

        public string getMessage()
        {
            return message;
        }
    }
    //用户A
    public class UserA : AbstractUser
    {
        public UserA(IMediator mediator, string name)
            : base(mediator, name)
        {
            mediator.regist(this);
        }

        public override void receiveMessage(string message)
        {
            Console.WriteLine("User A Received Message :" + message);
        }
    }
    //用户B
    public class UserB : AbstractUser
    {
        public UserB(IMediator mediator, string name)
            : base(mediator, name)
        {
            mediator.regist(this);
        }

        public override void receiveMessage(string message)
        {
            Console.WriteLine("User B Received Message :" + message);
        }
    }
    //用户C
    public class UserC : AbstractUser
    {
        public UserC(IMediator mediator, string name)
            : base(mediator, name)
        {
            mediator.regist(this);
        }

        public override void receiveMessage(string message)
        {
            Console.WriteLine("User C Received Message :" + message);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //创建聊天室(中介者)
            IMediator mediator = new ConcreteMediator();
            //创建用户信息
            IUser userA = new UserA(mediator, "张三");
            IUser userB = new UserB(mediator, "李四");
            IUser userC = new UserC(mediator, "王五");

            Console.WriteLine("------------------------------------------------------");
            userA.sendMessage("大家好,我叫张三!初来乍到,请多多关照!");
            Console.WriteLine();
            Console.WriteLine("------------------------------------------------------");
            userB.sendMessage("大家好,我叫李四!欢迎加入!");
            Console.WriteLine();
            Console.WriteLine("------------------------------------------------------");
            userC.sendMessage("我是王五,欢迎欢迎!");
            Console.WriteLine();
            Console.WriteLine("------------------------------------------------------");
        }
    }
}

类图:

中介者模式包含如下几个角色:

Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。

ConcreteMediator(具体中介者):具体中介者角色实现抽象中介者接口,具体协调各个同事类之间的协作。

Colleague(抽象同事类):定义与中介者之间沟通的接口。

ConcreteColleague(具体同事类):实现抽象同事角色接口,具体处理与中介者的通信行为。

主要优点:

1.中介者模式简化了对象之间的交互。一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星型结构。

2.中介者模式可将各同事对象解耦。

主要缺点:

在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

适用场景:

1.一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。注意是多个对象之前相互依赖。

2.想定制一个分部在多个类中的行为,而不像生成太多的子类的场合。

相关模式:

1.外观:在外观中,外观角色是构成系统内部复杂子系统的单一窗口,对系统外部提供更高一级的接口。外观是单向的信息传达。

2.中介者:中介者角色充当着各个同事对象之间信息交互的中间角色。中介者是双向的信息通信。

时间: 2024-11-15 07:06:34

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

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

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

设计模式之中介者模式20170731

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

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

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

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

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

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

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

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

前言:[模式总览]——————————by xingoo 模式意图 使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌! 应用场景 1 当一组对象要进行沟通或者业务上的交互,但是其关系却又很复杂混乱时,可以采用此模式. 2 当一个对象与其他的对象要进行紧密的交互,但又想服用该对象而不依赖其他的对象时. 3 想创造一个运行于多个类之间的对象,又不想生成新

设计模式之: 中介者模式

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

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

一.定义 又称为调停者模式,定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. 二.结构 组成: ● 抽象中介者(Mediator)角色:定义统一的接口用于各同事角色之间的通信,其中主要方法是一个(或多个)事件方法. ● 具体中介者(ConcreteMediator)角色:实现了抽象中介者所声明的事件方法.具体中介者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系. ● 抽象同事类(Colleague)

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

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

Java 设计模式之中介者模式

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