【C#设计模式-中介者模式】

一.概述:中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。

二.例子:QQ游戏平台,聊天室、QQ群和短信平台,这些都是中介者模式在现实生活中的应用。

三.结构:

者模式设计两个具体对象,一个是用户类,另一个是中介者类,根据针对接口编程原则,则需要把这两类角色进行抽象,所以中介者模式中就有了4类角色,它们分别是:抽象中介者角色,具体中介者角色、抽象同事类和具体同事类。中介者类是起到协调各个对象的作用,则抽象中介者角色中则需要保存各个对象的引用。

四.实现:

假设英雄联盟中两个玩家之间的相互攻击,会造成双方的HP的改变。不使用中介者模式:

    /// <summary>
    /// 抽象玩家类
    /// </summary>
    public abstract class AbstractPlayer
    {
        /// <summary>
        /// 玩家生命值
        /// </summary>
        public double HP { get; set; }

        /// <summary>
        /// 遭受攻击时候,生命值减少,对应攻击者的HP增加
        /// </summary>
        /// <param name="num">修改数</param>
        /// <param name="player">玩家</param>
        public abstract void ChangeHP(int num, AbstractPlayer player);
    }
    /// <summary>
    /// 玩家A adc
    /// </summary>
    public class adcPlayerA:AbstractPlayer
    {
        /// <summary>
        /// 遭受攻击时候,A生命值减少,对应攻击者的HP增加
        /// </summary>
        /// <param name="num"></param>
        /// <param name="player"></param>
        public override void ChangeHP(int num, AbstractPlayer player)
        {
            this.HP -= num;
            player.HP = num * 0.1 + player.HP;
        }
    }
    /// <summary>
    /// 玩家B ad
    /// </summary>
    public class adPlayerB:AbstractPlayer
    {
        /// <summary>
        /// 遭受攻击时候,b生命值减少,对应攻击者的HP增加
        /// </summary>
        /// <param name="num"></param>
        /// <param name="player"></param>
        public override void ChangeHP(int num, AbstractPlayer player)
        {
            this.HP -= num + player.HP * 0.01;
            player.HP = player.HP + num * 0.01;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AbstractPlayer a = new adcPlayerA();
            a.HP = 200;
            AbstractPlayer b = new adPlayerB();
            b.HP = 500;

            //a被b攻击
            Console.WriteLine("a玩家遭受b的20点攻击");
            a.ChangeHP(20, b);
            Console.WriteLine("a生命值>" + a.HP);
            Console.WriteLine("b生命值>" + b.HP);

            Console.WriteLine("");
            Console.WriteLine("b玩家遭受a的20点攻击");
            b.ChangeHP(20, a);
            Console.WriteLine("a生命值>" + a.HP);
            Console.WriteLine("b生命值>" + b.HP);
        }
    }

上面使用了抽象类使具体玩家A和玩家B都依赖于抽象类,从而降低了同事类之间的耦合度。对于上面的设计可以有进一步完善的方案的,即加入一个中介者对象来协调各个对象之间的关联。下面通过中介者模式

    /// <summary>
    /// 抽象玩家类
    /// </summary>
    public abstract class AbstractPlayer
    {
        /// <summary>
        /// 玩家生命值
        /// </summary>
        public double HP { get; set; }

        /// <summary>
        /// 遭受攻击时候,生命值减少,对应攻击者的HP增加
        /// </summary>
        /// <param name="num"></param>
        /// <param name="Mediator"></param>
        public abstract void ChangeHP(int num, AbstractMediator Mediator);
    }
    /// <summary>
    /// 中介者抽象类
    /// </summary>
    public abstract class AbstractMediator
    {
        protected AbstractPlayer A;
        protected AbstractPlayer B;

        public AbstractMediator(AbstractPlayer a, AbstractPlayer b)
        {
            A = a;
            B = b;
        }

        /// <summary>
        /// A被B攻击
        /// </summary>
        /// <param name="num"></param>
        public abstract void AEmbattled(int num);

        /// <summary>
        /// B被A攻击
        /// </summary>
        /// <param name="num"></param>
        public abstract void BEmbattled(int num);
    }
    /// <summary>
    /// 具体中介者
    /// </summary>
    public class MediatorPater:AbstractMediator
    {
        private AbstractPlayer a;
        private AbstractPlayer b;

        public MediatorPater(AbstractPlayer a, AbstractPlayer b) : base(a, b) { }

        public override void AEmbattled(int num)
        {
            A.HP -= num;
            B.HP = num * 0.1 + B.HP;
        }

        public override void BEmbattled(int num)
        {
            B.HP -= num + A.HP * 0.01;
            A.HP = A.HP + num * 0.01;
        }
    }
    /// <summary>
    /// 玩家A adc
    /// </summary>
    public class adcPlayerA:AbstractPlayer
    {
        /// <summary>
        ///  遭受攻击时候,A生命值减少,对应攻击者的HP增加
        /// </summary>
        /// <param name="num"></param>
        /// <param name="mediator"></param>
        public override void ChangeHP(int num, AbstractMediator mediator)
        {
            mediator.AEmbattled(num);
        }
    }
    /// <summary>
    /// 玩家B ad
    /// </summary>
    public class adPlayerB:AbstractPlayer
    {
        /// <summary>
        /// 遭受攻击时候,b生命值减少,对应攻击者的HP增加
        /// </summary>
        /// <param name="num"></param>
        /// <param name="mediator"></param>
        public override void ChangeHP(int num, AbstractMediator mediator)
        {
            mediator.BEmbattled(num);
        }
    }
/// <summary>
    /// C#设计模式-中介者模式
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            AbstractPlayer a = new adcPlayerA();
            a.HP = 200;
            AbstractPlayer b = new adPlayerB();
            b.HP = 500;

            AbstractMediator mediator = new MediatorPater(a,b);

            //a被b攻击
            Console.WriteLine("a玩家遭受b的20点攻击");
            a.ChangeHP(20, mediator);
            Console.WriteLine("a生命值>" + a.HP);
            Console.WriteLine("b生命值>" + b.HP);

            Console.WriteLine("");
            Console.WriteLine("b玩家遭受a的20点攻击");
            b.ChangeHP(20, mediator);
            Console.WriteLine("a生命值>" + a.HP);
            Console.WriteLine("b生命值>" + b.HP);
        }
    }

从上面实现代码可以看出,此时玩家A和玩家B都依赖于抽象的中介者类,这样如果其中某个玩家类变化,只会影响到该变化玩家类本身和中介者类。

五.中介者模式的适用场景:

一组定义良好的对象,现在要进行复杂的相互通信。

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

优点:

简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。

提供系统的灵活性,使得各个同事对象独立而易于复用。

缺点:

中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。例如,QQ游戏中计算欢乐豆的程序出错了,这样会造成重大的影响。

新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

中介者模式,定义了一个中介对象来封装系列对象之间的交互。

中介者使各个对象不需要显式地相互引用,从而使其耦合性降低,而且可以独立地改变它们之间的交互。

中介者模式一般应用于一组定义良好的对象之间需要进行通信的场合以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的情形下。

时间: 2024-10-14 08:01:36

【C#设计模式-中介者模式】的相关文章

7. 星际争霸之php设计模式--中介者模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248183.html============================================

[设计模式]中介者模式

1. 定义 用一个中介者对象来封装了一个系列对象的交互,中介者使得各个对象可以不需要显式的引用,而且可以独立改变对象之间的交互. 中介者模式思路很简单,中介者模式中通过引入一个中介者对象,让其他对象与中介者对象进行交互,而中介者对象知道如何和所有对象交互,这样对象之间的交互关系就没有了,从而实现对象之间解耦. 每个同事对象发生了变化,不需要知道这样会引起其他对象什么变化,只需要通知中介者,由中介者去与其他对象交互.这样的松耦合带来的好处是,同事对象之间的交互关系减少,而且有利于功能的修改和扩展.

大话设计模式—中介者模式

中介者模式(Mediator Pattern)是用来减少多个对象和类之间的通信复杂性. 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合.使代码易于维护. 中介者模式属于行为型模式. 引言: 虽然一个系统切割成很多对象通常能够添加其可复用性.可是对象间相互连接次数的添加又会减少其可复用性:大量的连接使得一个对象不可能在没有其它对象的支持下工作.系统表现为一个不可切割的总体,所以,对系统的行为进行不论什么较大的修改就十分困难了. 要解决这种问题.我们能够使用 迪米特原则 ,假设

PHP设计模式——中介者模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 中介者模式用一个中介者对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互. UML类图: 角色: 中介者接口(UnitedNations):在里面定义了各个同事之间相互交互所需要的方法. 具体的中介者实现对象(UnitedCommit):它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系. 同事类的定义(Country):通常实现成为抽象类,主要负责约束同

[设计模式] 中介者模式 Mediator Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 我们都知道,面向对象设计鼓励将行为分布到各个对象中.但是,这种分布可能会导致对象间有许多连接.在最坏的情况下,每一个对象都知道其他所有对象,就造成了复杂的关联关系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性.大量的相互连接使得一个对象似乎不太

深入浅出设计模式——中介者模式(Mediator Pattern)

模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:? 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理.? 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱.? 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统

PHP设计模式 - 中介者模式

中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改. 一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式.PHP中不是特别常用的设计模式. <?php abstract class Mediator { // 中介者角色 abstract public function send($message,$colleague); } abstract class Colleague { // 抽象对象 private

设计模式----中介者模式及简单总结(2018/10/30)

中介者模式 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 代码实现:   知识点回顾 设计模式的核心是: 高内聚 低耦合 代码编写多 但是方便维护 1. 单例模式: 懒汉和饿汉(直接就new 线程相对安全) 但是在unity不涉及多线程, 所以都行 一般人们写的懒汉多一点 1). 普通class 2). 里面一个私有的 静态属性 对象 3). 私有构造函数 4). 共有 静态 对象返回值类型的 方法(GetInstance/Ge

23种设计模式--中介者模式-Mediator Pattern

一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再把中介和用户类分成2个类,这样就成了抽象中介者角色,具体中介者角色.抽象同事类和具体同事类.来几个例子比如说各种游戏平台,还有我们最熟悉的QQ平台,等等这些都是中介者模式的具体应用,中介者模式常用于处理通信之间复杂有关联的业务,这样就会存在一个缺点比如说因为中介者处理了好多用户之间的关系,一但发生错