博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中介者模式
阅读量:6675 次
发布时间:2019-06-25

本文共 3105 字,大约阅读时间需要 10 分钟。

中介者模式,用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显式的相引用,从而

使其耦合松散,而且可以独立的改变他们之间的交互。
优点:
1、 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使系统成为松耦合系统。

2、 减少了子类的生成。

3、 可以减少各同事类的设计与实现。

缺点:
由于中介者对象封装了系统中对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。
在这里插入图片描述
Mediator: 抽象中介者。定义了同事对象到中介者对象之间的接口。

ConcreteMediator: 具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。

Colleague: 抽象同事类。
ConcreteColleague: 具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

在中介者模式中中介者对象处于核心地位,因为它定义了整个系统中所有具体同事类之间的关系。在整个系统中它主要承担两个方面的责任。

1、 结构上起到中转作用。通过中介者对象对关系的封装,使得具体的同事类不再需要显示的引用其他对象,它只需要通过中介者就可以完成与其他同事类之间的通信。

2、 行为上起到协作作用。中介者对同事类之间的关系进行封装,同事类在不需要知道其他对象的情况下通过中介者与其他对象完成通信。在这个过程中同事类是不需要指明中介者该如何做,中介者可以根据自身的逻辑来进行协调,对同事的请求进一步处理,将同事成员之间的关系行为进行分离和封装。

同时由于中介者对对象的关系进行了封装,使得各个同事类之间的耦合减少了,使得他们可以独立改变和复用。

3、 在中介者模式中通过引用中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少。它简化了系统的结构,将系统由负责的网状结构转变成简单的星形结构,中介者对象在这里起到中转和协调作用。

4、 中介者类是中介者模式的核心,它对整个系统进行控制和协调,简化了对象之间的交互,还可以对对象间的交互进行进一步的控制。

5、 通过使用中介者模式,具体的同事类可以独立变化,通过引用中介者可以简化同事类的设计和实现。

6、 就是由于中介者对象需要知道所有的具体同事类,封装具体同事类之间相互关系,导致中介者对象变得非常复杂,系统维护起来较为困难。

/// /// 中介者抽象类///  public abstract class Mediator{    public abstract void Send(string message,Colleague colleague);  }   /// /// 具体中介者类///   public class ConcretMediator : Mediator{    private ConcretColleague1 colleague1;    private ConcretColleague2 colleague2;    public ConcretColleague1 Colleague1 { get => colleague1; set => colleague1 = value; }    public ConcretColleague2 Colleague2 { get => colleague2; set => colleague2 = value; }    public override void Send(string message, Colleague colleague)    {        if (colleague == colleague1)        {            colleague2.Recevice(message);        }        else        {            colleague1.Recevice(message);        }    }} }  ///  /// 抽象同事类 ///  public abstract  class Colleague  {    private Mediator mediator;    public Mediator Mediator { get => mediator; set => mediator = value; }    public Colleague(Mediator mediator)    {        this.mediator = mediator;    }   }/// /// 具体同事类1/// public class ConcretColleague1 : Colleague{    public ConcretColleague1(Mediator mediator) : base(mediator)    {    }    ///     /// 通过中介者发送消息    ///     ///     public void Send(string message)    {        this.Mediator.Send(message,this);    }    ///     ///接收消息    ///     ///     public void Recevice(string message)    {        Console.WriteLine("ConcretColleague1收到消息:"+message);    }    } /// /// 具体同事类2/// public class ConcretColleague2 : Colleague{    public ConcretColleague2(Mediator mediator) : base(mediator)    {    }    ///     /// 通过中介者发送消息    ///     ///     public void Send(string message)    {        this.Mediator.Send(message, this);    }    public void Recevice(string message)    {        Console.WriteLine("ConcretColleague2收到消息:"+message);    }     } /// /// 中介者模式///   class Program  {    static void Main(string[] args)    {        ConcretMediator m=new ConcretMediator();        ConcretColleague1 c1=new ConcretColleague1(m);        ConcretColleague2 c2=new ConcretColleague2(m);        m.Colleague1 = c1;        m.Colleague2 = c2;        m.Send("你吃了吗",c1);        m.Send("我吃了,你呢?",c2);        Console.ReadKey();     }   }

在这里插入图片描述

转载地址:http://ddrxo.baihongyu.com/

你可能感兴趣的文章
第五周作业
查看>>
python考试
查看>>
what
查看>>
Javascript图片轮播
查看>>
java 实现七大基本排序算法
查看>>
Single Number
查看>>
bat批量重命名文件
查看>>
Java使用对象流读取文件的问题
查看>>
算法作业
查看>>
4.15 Service笔记
查看>>
码教授J41项目答辩胜利结束,码教授为他们圆梦
查看>>
5 .5 数据库关系图
查看>>
bzoj 2044 三维导弹拦截——DAG最小路径覆盖(二分图)
查看>>
获取一篇新闻的全部信息
查看>>
dev 小问题列表
查看>>
PHP常用MySql操作
查看>>
UT源码+105032014018
查看>>
extjs grid 列顺序紊乱问题
查看>>
狗扑论坛 自动刷取VIP狗粮
查看>>
上传图片保存到MySql数据库并显示--经验证有效
查看>>