尽管将一个系统分割成许多对象通常可以增加其可服用性, 但是对象间相互连接的激增又会降低其可复用性了. 大量的连接使得一个对象不可能在没有改变其他对象的支持下工作, 系统表现为一个不可分割的整体, 所以, 对系统的行为进行任何较大的改动就十分困难了.

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

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
abstract class  {
public abstract void Send(string message, Colleague colleague);
} abstract class Colleague {
protected Mediator mediator; public Colleague(Mediator mediator) {
this.mediator = mediator;
}
} class ConcreteMediator : {
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2; public ConcreteColleague1 Colleague1 {
set {
colleague1 = value;
}
}
public ConcreteColleague2 Colleague2 {
set {
colleague2 = 大专栏  Design Patterns 25 class="keyword">value;
}
} public override void Send(string message, Colleague colleague) {
if(colleague == colleague1) {
colleague2.Notify(message);
}
else {
colleague1.Notify(message);
}
}
} class ConcreteColleague1 : Colleague {
public ConcreteColleague1(Mediator mediator) : base(mediator) { } public void Send(string message) {
mediator.Send(message, this);
} public void Notify(string message) { }
} class ConcreteColleague2 : Colleague {
public ConcreteColleague2(Mediator mediator) : base(mediator) { } public void Send(string message) {
mediator.Send(message, this);
} public void Notify(string message) { }
}

中介者模式优缺点

中介者模式很容易在系统中应用, 也很容易在系统中误用. 当系统出现了”多对多”交互复杂的对象群时, 不要急于使用中介者模式, 而要先反思你的系统在设计上是不是合理.

  • 优点
    1. Mediator的出现减少了各个Colleague的耦合, 使得可以独立的改变和复用各个Colleague类和Mediator.
    2. 由于把对象如何协作进行了抽象, 将中介作为一个独立的概念并将其封装在一个对象中, 这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来, 也就是站在一个更宏观的角度去看待系统.
  • 缺点
    1. 由于ConcreteMediator控制了集中化, 于是就把交互复杂性变为了中介者的复杂性, 这就使得中介者会变得比任何一个ConcreteColleague都复杂.

中介者模式一般应用与一组对象已定义良好但是复杂的方式进行通信的场合, 以及想定制一个分布在多个类中的行为, 而又不想生成太多的子类的场合.

Design Patterns 25的更多相关文章

  1. Design Patterns Example Code (in C++)

    Overview Design patterns are ways to reuse design solutions that other software developers have crea ...

  2. Design Patterns in Android

    对日常在 Android 中实用设计模式进行一下梳理和总结,文中参考了一些网站和大佬的博客,如 MichaelX(xiong_it) .菜鸟教程.四月葡萄.IAM四十二等,在这里注明下~另外强烈推荐图 ...

  3. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  4. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  5. Head First Design Patterns

    From Head First Design Patterns. Design Principle: Idnetify the aspects of your application that var ...

  6. Apex Design Patterns

    Apex allows you to build just about any custom solution on the Force.com platform. But what are the ...

  7. [Design Patterns] 4. Creation Pattern

    设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...

  8. [Design Patterns] 3. Software Pattern Overview

    When you're on the way which is unknown and dangerous, just follow your mind and steer the boat. 软件模 ...

  9. [Design Patterns] 1. Primary concept & term - UML

    It's time to review design patterns, especially when I reach the turning-point of my career. That's ...

随机推荐

  1. git的基础使用

    GIT """ 什么是git:版本控制器 - 控制的对象是开发的项目代码 代码开发时间轴:需求1 > 版本库1 > 需求2 > 版本库2 > 版本 ...

  2. AFNetWorking3.0.4(Weather Demo)

    参考文章:http://www.jianshu.com/p/99bcc40abb30 demo下载地址:http://pan.baidu.com/s/1eRuYDEi 密码:ma5m 使用最新AFNe ...

  3. ZJNU 1138 - 小兔的棋盘——中级

    二维图的动态规划因为不能穿越对角线,则选取对角线的一边dp即可选取对角线右下侧则x轴上每个点只能由其左侧的点走过去(只有1条)对角线上的点只能由对角线下方的点走过去其他点可以由左侧和下侧两种方式到达因 ...

  4. Linux svn 服务器配置--转

    转自 http://my.oschina.net/lionel45/blog/298305 留存备份. Linux搭建SVN 服务器 作者: 沈小然    日期:2014年 8月 5日 1       ...

  5. python,winreg,获取当前系统的桌面绝对路径

    import winreg import os def main(): new_path = os.path.join(desktop_path(), 'aaa.xlsx') # 结果为:C:\\Us ...

  6. centos telnet

    yum install telnet yum install telnet-server

  7. LeetCode No.118,119,120

    No.118 Generate 杨辉三角 题目 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例 输入: 5 输出: [ ...

  8. EF 执行存储过程

  9. 常用JS图片滚动(无缝、平滑、上下左右滚动)

    常用JS图片滚动(无缝.平滑.上下左右滚动)代码大全 <head><-----></head><body> <!--向下滚动代码开始-->& ...

  10. Ubuntu 12.04 编译bcm93349dcm软件包

    1.准备工作操作系统:Ubuntu 12.04 获取bcm93349dcm软件包: bootloader源代码:Bootloader_2_2_0.zip CM源代码:ProdD20_BFC4.4.10 ...