• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

04月
29
C#
设计模式

设计模式-中介者模式

发表于 2022-04-29 • 字数统计 2882 • 被 2,127 人看爆

定义

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

举例

例如常见的qq群文件,用户将文件上传到QQ群,其他用户可以QQ群上下载文件。QQ群就是中介者
或者像联合国,各国围绕联合国,联合国就是中介者

结构

中介者模式结构图.png

实现

//定义一个抽象的发送消息方法,得到同事对象和发送信息
abstract class Mediator
{
    public abstract void Send(string message, Colleague colleague);
}

//抽象同事类
abstract class Colleague
{
    protected Mediator mediator;
    public Colleague(Mediator mediator)
    {
        this.mediator = mediator;
    }
}

//具体中介者类
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);
        }
    }


}

//同事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("没有呢,你打算请客?");
        
    }
}

优点

  • (1)中介者模式简化了对象之间的交互,它用中介者和同事的对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星形结构。
  • (2)可将各同事对象解耦,中介者模式有利于各同事之间的松耦合,可以独立地改变和复用每一个同事和中介者,增加新的中介者类和新的同事类都比较方便,更好地符合开闭原则。
  • (3)可以减少子类的生成,中介者模式将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须直接对同事类进行扩展。

缺点

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

适用环境

  • (1)系统中对象之间存在着复杂的引用关系,系统结构混乱且难以理解。
  • (2)一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
  • (3)用户想通过一个中间类来封装多个类中的行为,又不想生成太多的子类,此时可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的具体中介者类。
分享到:
设计模式-备忘录模式
设计模式-迭代器模式
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,080次看爆
  • JAVA_HOME环境配置问题 3,730次看爆
  • AssetBundle使用 3,499次看爆
  • VSCode配置C++开发环境 3,257次看爆
  • Lua反射 3,133次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图