软件设计模式——中介者模式(Mediator)
2016-04-20 08:37
465 查看
转自:http://blog.csdn.net/wangyanguiyiyang
简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“调停”对象,使得两头的对象分别和“调停”对象引用或者依赖。
当然并不是所有的对象都需要加入“调停”对象。如果对象之间的关系原本一目了然,调停对象的加入便是“画蛇添足”。
来看下调停者模式的组成部分吧。
1) 抽象调停者(Mediator)角色:抽象调停者角色定义统一的接口用于各同事角色之间的通信。
2)具体调停者(Concrete Mediator)角色:具体调停者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
3)同事(Colleague)角色:每一个同事角色都知道对应的具体调停者角色,而且与其他的同事角色通信的时候,一定要通过调停者角色协作。
运算结果:
Mediator is talking
Mediator is fighting
定义与结构
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。GOF 给调停者模式下的定义是:用一个中介类对象来封装一系列的对象交互。调停者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“调停”对象,使得两头的对象分别和“调停”对象引用或者依赖。
当然并不是所有的对象都需要加入“调停”对象。如果对象之间的关系原本一目了然,调停对象的加入便是“画蛇添足”。
来看下调停者模式的组成部分吧。
1) 抽象调停者(Mediator)角色:抽象调停者角色定义统一的接口用于各同事角色之间的通信。
2)具体调停者(Concrete Mediator)角色:具体调停者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
3)同事(Colleague)角色:每一个同事角色都知道对应的具体调停者角色,而且与其他的同事角色通信的时候,一定要通过调停者角色协作。
中介者模式的实现
//抽象调停者角色--Mediator public interface IMdiator { public void fight(); public void talk(); public void registerA(ColleagueA a); public void registerB(ColleagueB b); }
//具体调停者角色--ConcreteMediator public class ConcreteMediator implements IMdiator{ ColleagueA talk; ColleagueB fight; @Override public void fight() { System.out.println("Mediator is fighting"); } @Override public void talk() { System.out.println("Mediator is talking"); } @Override public void registerA(ColleagueA a) { talk = a; } @Override public void registerB(ColleagueB b) { fight = b; } }
//抽象同事角色--Colleague public abstract class Colleague { IMdiator mediator; public abstract void doSomething(); }
//具体同事角色--ConcreteColleagueA public class ColleagueA extends Colleague{ public ColleagueA(IMdiator mediator) { this.mediator = mediator; this.mediator.registerA(this); } @Override public void doSomething() { this.mediator.talk(); } }
//具体同事角色--ConcreteColleagueB public class ColleagueB extends Colleague{ public ColleagueB(IMdiator mediator) { this.mediator = mediator; this.mediator.registerB(this); } @Override public void doSomething() { this.mediator.fight(); } }
//测试类 public class MediatorTest { public static void main(String[] args) { IMdiator mediator = new ConcreteMediator(); ColleagueA talkColleague = new ColleagueA(mediator); ColleagueB fightColleague = new ColleagueB(mediator); talkColleague.doSomething(); fightColleague.doSomething(); } }
运算结果:
Mediator is talking
Mediator is fighting
相关文章推荐
- Linux或者Mac下adb连接失败如何解决
- java基础(11)-- 深入理解Arrays.sort()
- 如何学习Opencv资料?opencv的安装使用
- 个人工作总结02
- css布局金融首页
- linux下文件系统swap交换分区及dd命令详解(3)
- 六周# 学习进度总结
- Android自定义控件之日历控件
- 六周# 学习进度总结
- 【bzoj3832】【poi2014】【Rally】【拓扑排序+线段树】
- Swift,任重而道远!
- ABAP程序互调用:SUBMIT、CALL TRANSACTION、LEAVE TO TRANSACTION
- 汽车之家私有化悬念,其实答案早已很明显
- SharePoint 2013 定制搜索显示模板
- 微信-网站 会员整合流程(会员同步登陆)
- ABAP编程中对内表的定义,后面接一个OCCURS (n)的意义
- JetBrains 加入 .NET 基金会
- ASP.NET Core的配置(2):配置模型详解
- 采用MiniProfiler监控EF与.NET MVC项目
- 聊聊appstore审核之事