原文 第17章 中介者模式(Mediator Pattern)

中介者模式

 概述:

 

在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进行修改将会非常困难。为了对系统的对象进行解耦,可以引入一个间接层来管理对象之间的关系,这就是中介者模式。

结构图:

 

 

 

      借图理解:

   使用中介者

   

 

       示例:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  /// <summary>
    /// 抽象中介者
    /// </summary>
    public abstract class Mediator
    {
        public Colleague _colleague;
        public Colleague GetColleague()
        {
            return _colleague;
 
        }
        public void SetColleague(Colleague colleague)
        {
            _colleague = colleague;
        }
        public abstract void DoSomething();
 
    }
    /// <summary>
    /// 具体的中介者
    /// </summary>
    public class ConcreteMediator : Mediator
    
     public override void DoSomething()
     {
         //调用Colleague对象的方法
         _colleague.Method();
     }
    }
    /// <summary>
    /// 抽象Colleague
    /// </summary>
    public abstract class Colleague
    {
       public abstract void Method();
    }
    /// <summary>
    /// 具体的Colleague
    /// </summary>
    public class ConcreteColleague1:Colleague
    {
 
        private Mediator mediator;
        public ConcreteColleague1(Mediator mediator)
        {
            this.mediator = mediator;
        }
        public override void Method()
        {
            Console.WriteLine("ConcreteColleague1要做的事!");
        }
    }
    /// <summary>
    /// 具体的Colleague
    /// </summary>
    public class ConcreteColleague2 : Colleague
    {
 
        private Mediator mediator;
        public ConcreteColleague2(Mediator mediator)
        {
            this.mediator = mediator;
        }
        public override void Method()
        {
            Console.WriteLine("ConcreteColleague2要做的事!");
        }
    }

客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    class Program
    {
        static void Main(string[] args)
        {
 
            Mediator mediator = new ConcreteMediator();
 
            Colleague coll1 = new ConcreteColleague1(mediator);
            mediator.SetColleague(coll1);
            coll1.Method();
            Console.ReadLine();
 
            Colleague coll2 = new ConcreteColleague2(mediator);
            mediator.SetColleague(coll2);
            coll2.Method();
            Console.ReadLine();
        }
    }

效果:

    

1.降低了系统对象之间的耦合性,使得对象易于独立的被复用。

2.提高系统的灵活性,使得系统易于扩展和维护。

适用场景:

     

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

2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

3.想定制一个分布在多个类中的行为,而又不想生成太多的子类。

设计模式系列文章入口:http://www.diyibk.com/post/39.html

第17章 中介者模式(Mediator Pattern)的更多相关文章

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

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

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

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

  3. 中介者模式(Mediator Pattern)

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

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

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

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

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

  6. 4.7 《硬啃设计模式》 第24章 麻烦的多角关系 - 中介者模式(Mediator Pattern)简介

    在Windows程序中,有时候界面控件之间的交互会很麻烦,如:A控件显示什么的时候,B控件要显示什么,另外C控件要不可用,同样其它控件也会有类似的复杂要求.控件与控件之间很容易形成复杂的多角关系了.现 ...

  7. 18.中介者模式(Mediator Pattern)

    using System; namespace Test { class Program { /// <summary> /// 中介者模式,定义了一个中介对象来封装一系列对象之间的交互关 ...

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

    一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...

  9. 十一个行为模式之中介者模式(Mediator Pattern)

    定义: 用一个中介对象(中介者)来封装一系列的对象交互,使各个对象之间不需要显式地相互引用,从而降低耦合度,而且可以独立地改变他们之间的交互关系. 解耦后: 结构图: Mediator:抽象中介者,定 ...

随机推荐

  1. 【Web探索之旅】第三部分第三课:协议

    内容简介 1.第三部分第三课:协议 2.第四部分预告:Web程序员 第三部分第三课:协议 之前的课,我们学习了Client-Server模型的客户端语言和服务器语言. 客户端语言有HTML,CSS和J ...

  2. lua、groovy嵌入到java中的性能对比(转)

    lua和groovy都是可以嵌入到java中的脚本语言.lua以高性能著称,与C/C++在游戏开放中有较多使用,groovy是一个基于Java虚拟机(JVM)的敏捷动态语言,在jvm下有着不错的性能. ...

  3. TCP/IP 网络精讲:OSI七层模型(第二课)

    内容简介 1.前言 2.第一部分第二课:互联网的创立,OSI七层模型 3.第一部分第三课预告:OSI第一层,连接你的机器 前言 PS:昨天做了课程大纲之后,发现这个坑挖得有点大.不过既然挖了,岂有不跳 ...

  4. tcpdump参数及使用介绍(转)

    原文地址:http://dogdogcom.blog.51cto.com/2402458/490398 tcpdump -a 将网络地址和广播地址转变成名字: -d 将匹配信息包的代码以人们可以理解的 ...

  5. [生产环境数据恢复]innobackupex: fatal error: OR no &#39;datadir&#39; option in group &#39;mysqld&#39; in MySQL options

    1 运行恢复命令  [xxx@xxx-c001db1 tmp]$ time /usr/bin/innobackupex --rsync --user="user" --passwo ...

  6. 2014年10本月微软MVP应用程序启动!

     2014年10本月微软MVP启动应用程序!    CSDN与微软合作,长期为用户提供申请"微软最有价值专家"的平台,希望有兴趣.资历的朋友以及正在朝这个方向努力的朋友可以积极參与 ...

  7. PHP訪问MySql数据库 0基础篇

    在站点后台,常常要与数据库打交道.本文介绍怎样使用XAMPP来管理MySql数据库及怎样用PHP来訪问MySql数据库. 一.使用XAMPP来管理MySql数据库 首先使用XAMPP打开MySql的管 ...

  8. MFC9.0 Outlook控件的标题显示无法改动

    这是我在开发中遇到的问题,现记录下来,以便帮助你们. 不想看废话的能够仅仅看最后三行,但你会错过非常多. 俗话说的好啊,"Wise men learn by other men's mist ...

  9. hdu 4912 Paths on the tree(lca+馋)

    意甲冠军:它使树m路径,当被问及选择尽可能多的路径,而这些路径不相交. 思考:贪心,比較忧伤.首先求一下每对路径的lca.依照lca的层数排序.在深一层的优先级高.那么就能够贪心了,每次选择层数最深的 ...

  10. Java操作memcached(一)

    Memcached事实上,两次Hash算法    第一次hash算法被用于定位Memcached示例    第二次hash算法是底部HashMap中间hash算法 Hash算法      1.依据余数 ...