一、中介者模式的介绍

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

二、中介者模式Demo

不使用中介者模式的Demo

/// <summary>
    /// 拳击者得类包括得分,和受到攻击时得分变化得方法
    /// </summary>
    public abstract class AbstractFight
    {
        //得分
        public double grade;
        /// <summary>
        /// 受到打击时或者主动出击时得分得变化
        /// </summary>
        /// <param name="num"></param>
        /// <param name="fight"></param>
        public abstract double ChangeGrade(double num, AbstractFight fight);
    }

///具体实现

public class ZouShimingFight : AbstractFight
    {
        /// <summary>
        /// 邹市明被打时得分下降,坤比七得分上涨
        /// num表示得分,fight表示坤比七对象
        /// </summary>
        /// <param name="num"></param>
        /// <param name="fight"></param>
        public override double ChangeGrade(double num, AbstractFight fight)
        {
            this.grade -= num;
            fight.grade = fight.grade + num;
            return this.grade;
        }
    }

public class KunBiQiFight : AbstractFight
    {
        public override double ChangeGrade(double num, AbstractFight fight)
        {
            this.grade -= num;
            fight.grade = fight.grade + num;
            return this.grade;
        }
    }

///调用

AbstractFight zouFight = new ZouShimingFight();
            zouFight.grade = 100;
            AbstractFight kunFigeht = new KunBiQiFight();
            kunFigeht.grade = 100;

            Console.WriteLine("比赛开始");
            double zouGrade=zouFight.ChangeGrade(10, kunFigeht);
            double kunGrade = kunFigeht.ChangeGrade(30, zouFight);
            if (zouGrade > kunGrade)
            {
                Console.WriteLine("邹市明胜利");
            }

使用中介者模式的Demo

/// <summary>
    /// 拳击者得类包括得分,和受到攻击时得分变化得方法
    /// </summary>
    public abstract class AbstractFight
    {
        //得分
        public double grade;
        /// <summary>
        /// 受到打击时或者主动出击时得分得变化
        /// </summary>
        /// <param name="num"></param>
        /// <param name="fight"></param>
        public abstract double ChangeGrade(double num, AbstractMediator fight);
    }

/// <summary>
    /// 抽象中介者
    /// </summary>
    public abstract  class AbstractMediator
    {
        protected AbstractFight zouFight;
        protected AbstractFight kunFight;

        public AbstractMediator(AbstractFight _zouFight,AbstractFight _kunFight)
        {
            zouFight = _zouFight;
            kunFight = _kunFight;
        }
        /// <summary>
        /// 邹市明被打得分
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        public abstract double ZouEmbattled(double num);
        /// <summary>
        /// 坤比七被打得分
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        public abstract double KunEmbattled(double num);
    }

/// <summary>
    /// 实现抽象中介者
    /// </summary>
    public class MeditorFight : AbstractMediator
    {
        public MeditorFight(AbstractFight _zouFight, AbstractFight _kunFight) : base(_zouFight, _kunFight)
        {
        }

        public override double KunEmbattled(double num)
        {
            zouFight.grade -= num;
            kunFight.grade = kunFight.grade + num;
            return zouFight.grade;
        }

        public override double ZouEmbattled(double num)
        {
            kunFight.grade -= num;
            zouFight.grade = zouFight.grade + num;
            return kunFight.grade;
        }
    }

/// <summary>
    /// 具体实现
    /// </summary>
    public class ZouShimingFight : AbstractFight
    {
        public override double ChangeGrade(double num, AbstractMediator fight)
        {
           return  fight.ZouEmbattled(num);
        }
    }

public class KunBiQiFight : AbstractFight
    {
        public override double ChangeGrade(double num, AbstractMediator fight)
        {
            return fight.KunEmbattled(num);
        }
    }

///调用

AbstractFight zouFight = new ZouShimingFight();
            zouFight.grade = 100;

            AbstractFight kunFight = new KunBiQiFight();
            kunFight.grade = 100;

            //解耦
            AbstractMediator mFight =new MeditorFight(zouFight, kunFight);

            Console.WriteLine("比赛开始");
            double zouGrade=zouFight.ChangeGrade(10, mFight);
            double kunGrade = kunFight.ChangeGrade(30, mFight);

            if (zouGrade > kunGrade)
            {
                Console.WriteLine("邹市明胜利!!");
                
            }
            Console.ReadKey();

三、GitHub

https://github.com/wangtongzhou520/Designpattern

23种设计模式--中介者模式-Mediator Pattern的更多相关文章

  1. 二十四种设计模式:中介者模式(Mediator Pattern)

    中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...

  2. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  3. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  4. java的23种设计模式之建造者模式

    场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...

  5. 中介者模式(Mediator Pattern)

    用于减少多个对象或类之间的通信复杂性. 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合来维护代码.中介者模式属于行为模式类别. 实现实例 在这里通过一个聊天室的示例来演示中 ...

  6. 实践GoF的23种设计模式:建造者模式

    摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...

  7. JAVA开发的23种设计模式之 --- 桥接模式

    桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多 ...

  8. 24种设计模式--中介者模式【Mediator Pattern】

    各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...

  9. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

随机推荐

  1. 【.net 深呼吸】设置序列化中的最大数据量

    欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...

  2. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  3. Java 8五大主要功能为开发者提供了哪些便利?

    两年前当Java 8发布后,立即受到了业界的欢迎,因为它大大提高了Java的性能.它独特的卖点是,顾及了编程语言的每一个方面,包括JVM(Java虚拟机)和编译器,并且改良了其它帮助系统. Java是 ...

  4. 如何选择PHP框架?

    PHP是世界上最受欢迎的编程语言之—.最近发布的PHP7令这种服务器的编程语言比以前变得更好,更稳定了. PHP被广泛应用于重大的项目.例如Facebook就是使用PHP来维护和创建它们的内部系统的. ...

  5. 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?

    引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...

  6. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

  7. .NET面试题集锦②(Part 二)

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复. ]; ArrayList my ...

  8. 【夯实PHP基础】PHP数组,字符串,对象等基础面面观

    本文地址 分享提纲 1.数组篇 2.字符创篇 3.函数篇 4.面向对象篇 5.其他篇 /*************************** 一.数组篇 Begin***************** ...

  9. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  10. 【转】组件化的Web王国

    本文由 埃姆杰 翻译.未经许可,禁止转载!英文出处:Future Insights. 内容提要 使用许多独立组件构建应用程序的想法并不新鲜.Web Component的出现,是重新回顾基于组件的应用程 ...