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

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

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. 编译x64c++出错,errorC1900:P1和P2之间 Il 不匹配问题

    搜索了下相关资料,有一个说法是编译x64时本地缺失一些东西,2015安装update3就行. 我的是2013update4,找了下最新的有update5,安装然而并没有什么用. 最后还是重新找对应版本 ...

  2. Python语言学习:列表常用的方法

    python 列表常用的方法 1.append( ):用于在列表末尾添加新的对象 list.appent(obj) #obj:添加到列表末尾的对象 #!/usr/bin/python aList = ...

  3. 在维护项目中的UUID工具类

    import java.util.UUID; /** * <p> * Title:uuID生成器 * </p> * <p> * Description:UUID 标 ...

  4. scala编程(七)——内建控制结构

    几乎所有的 Scala 的控制结构都会产生某个值.这是函数式语言所采用的方式,程序被看成是计算值的活动,因此程序的控件也应当这么做.另外,指令式语言经常具有三元操作符(如 C,C++和 Java 的? ...

  5. ORs-4-Enhanced Role of OR Gene Loss (Pseudogenization) in Birds

    Enhanced Role of OR Gene Loss (Pseudogenization) in Birds 1.因为文献已经证明(a)基因缺失和得到对于进化有影响,(b)大的基因家族对进化影响 ...

  6. AJAX数据传输

    AJAX = Asynchronous JavaScript and XML(异步的Javascript和XML) AJAX最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页 ...

  7. Redis实现分布式读写锁(Java基于Lua实现)

    https://blog.csdn.net/grandachn/article/details/89032815 https://blog.csdn.net/xingsilong/article/de ...

  8. LeetCode No.70,71,72

    No.70 ClimbStairs 爬楼梯 题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. ...

  9. Iterator迭代器解决[为何禁止在foreach内增删]

    迭代器的应用场景: 1.对集合进行增加删除,禁止使用foreach,循环的动态操作2.倒序遍历3.遍历循环 步入正题:为何禁止在foreach内进行增删? 先看一下代码: /**         *  ...

  10. OpenCV、EmguCV函数注解