设计模式16:Mediator 中介者模式(行为型模式)
Mediator 中介者模式(行为型模式)
依赖关系的转化
动机(Motivation)
在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的更改,这种直接的引用将面临不断的变化。
在这种情况下,我们可以使用一个“中介对象”来管理对象间的关联关系,避免相互的对象之间的紧耦合引用关系,从而更好地抵御变化。
意图(Intent)
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。——《设计模式》GoF
结构(Structure)
示例代码
abstract class Mediator//中介者类
{
//定义一个抽象的发送消息方法,得到同事对象和发送消息
public abstract void Send(string message, Colleague colleague);
} abstract class Colleague
{
protected Mediator mediator; //构造方法,得到中介者对象
public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
} class ConcreateColleague1 : Colleague
{
public ConcreateColleague1(Mediator mediator):base(mediator)
{ } public void Send(string message)
{
mediator.Send(message,this);
} public void Notify(string message)
{
Console.WriteLine("同事1得到消息:"+message);
}
} class ConcreateColleague2 : Colleague
{
public ConcreateColleague2(Mediator mediator)
: base(mediator)
{ } public void Send(string message)
{
mediator.Send(message, this);
} public void Notify(string message)
{
Console.WriteLine("同事2得到消息:" + message);
}
} class ConcreteMediator : Mediator
{
private ConcreateColleague1 colleague1;
private ConcreateColleague2 colleague2; public ConcreateColleague1 Colleague1
{
set { colleague1 = value; }
} public ConcreateColleague2 Colleague2
{
set { colleague2 = value; }
} public override void Send(string message, Colleague colleague)
{
if (colleague == colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}
客户端调用:
static void Main(string[] args)
{
ConcreteMediator m=new ConcreteMediator();
ConcreateColleague1 c1=new ConcreateColleague1(m);
ConcreateColleague2 c2=new ConcreateColleague2(m); m.Colleague1 = c1;
m.Colleague2 = c2; c1.Send("吃过饭了吗?");
c2.Send("没有呢,你打算请客?"); Console.ReadKey();
}
输出:
同事2得到消息:吃过饭了吗?
同事1得到消息:没有呢,你打算请客?
Mediator模式的几个要点
- 将多个对象间复杂关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联“为”对多个对象和一个中介者关联“,简化了系统的维护,抵御了可能的变化。
- 随着逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时可对Mediator对象进行分解处理。
- Facade模式是解耦系统外到系统内(单向)的对象关联关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。
转载请注明出处:
作者:JesseLZJ
出处:http://jesselzj.cnblogs.com
设计模式16:Mediator 中介者模式(行为型模式)的更多相关文章
- (转)Java经典设计模式(1):五大创建型模式(附实例和详解)
原文出处: 小宝鸽 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代 ...
- FactoryMethod工厂方法模式(创建型模式)
1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...
- Prototype原型模式(创建型模式)
1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...
- 设计模式(五):PROTOTYPE原型模式 -- 创建型模式
1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- 设计模式18:Observer 观察者模式(行为型模式)
Observer 观察者模式(行为型模式) 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象) ...
- 设计模式01: Singleton 单例模式(创建型模式)
Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...
- 设计模式学习之单例模式(Singleton,创建型模式)(4)
假如程序中有一个Person类,我的需求就是需要在整个应用程序中只能new一个Person,而且这个Person实例在应用程序中进行共享,那么我们该如何实现呢? 第一步: 新建一个Person类,类中 ...
- 设计模式(十四):Command命令模式 -- 行为型模式
1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来 ...
- [C#]设计模式-建造者模式-创建型模式
介绍完工厂模式,现在来看一下建造者模式.建造者模式就是将一系列对象组装为一个完整对象并且返回给用户,例如汽车,就是需要由各个部件来由工人建造成一个复杂的组合实体,这个复杂实体的构造过程就被外部化到一个 ...
随机推荐
- 继承String?
不能继承,因为 public final class String extends Objectimplements Serializable, Comparable<String>, C ...
- Less、Sass/Scss
一.Less.Sass/Scss是什么? 1.Less: 是一种动态样式语言. 对CSS赋予了动态语言的特性,如变量.继承.运算.函数. Less 既可以在客户端上运行 (支持IE 6+, Webki ...
- 转--activemq的官方中文文档
1 JMS 在介绍ActiveMQ之前,首先简要介绍一下JMS规范. 1.1 JMS的基本构件 1.1.1 连接工厂 连接工厂是客户用来创建连接的对象,例如ActiveMQ提供的ActiveMQCon ...
- Rhythmk 一步一步学 JAVA (16) dom4j 操作XML
1.项目文件结构图: 2.文件代码: doc.xml <?xml version="1.0" encoding="UTF-8"?> <Shop ...
- C#对Excel的图文操作
1.打印Excel 目前的商业工具如水晶报表,ActiveReport等,都提供了灵活,强大的功能,但是对于比较特殊化的表格,特别是国内的一些应用,都是一个个的格子组成的,这样要是用线来一根根画就比较 ...
- oracle常用函数总结(二)
之前也有写过“oracle常用函数总结(一)”,为了尽量找全常见oracle函数,笔者特意查找了相关资料来作为参考,下边给大家罗列出来,部分和之前有重复的,希望能帮到大家! 列举了31个函数和1个分组 ...
- linux下使用adb查看android手机的logcat
root@ubuntu:/home/song# adb logcat -s VLC
- 塔防游戏 Day2
1. 创建炮塔选择的 UI 使用 UI -> Toggle .注意指定同一 group. 2. 创建炮台的数据类 [System.Serializable] // 序列化 public clas ...
- vector(实现存图)
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #i ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 18—Photo OCR 应用实例:图片文字识别
Lecture 18—Photo OCR 应用实例:图片文字识别 18.1 问题描述和流程图 Problem Description and Pipeline 图像文字识别需要如下步骤: 1.文字侦测 ...