Java设计模式之《调停者模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6518603.html
调停者模式。
我们想象一下这样的场景:一个系统内部通过许多的类互相之间相互调用来完成一系列的功能,这个系统内部的每个类都会存在至少一次的调用与被调用,多者数不胜数,这种情况下,一旦某个类发生问题,进行修改,无疑会影响到所有调用它的类,甚至它调用的类,可见这种情况下,类与类之间的耦合性极高(体现为太多的复杂的直接引用)。
这正是调停者模式的主场,调停者犹如第三方中介一般,将所有的类与类之间的引用都导向调停者类,所有类的请求,一致发向调停者,由调停者再发向目标类,这样原本复杂的网状的类关系,变成了简单的星型类关系,调停者类位于核心,所有其他类位于外围,指向调停者。如此这般,类与类之间的直接调用耦合被解除(通过统一的第三方来发起调用),某个类发生问题,发生修改,也只会影响调停者,而不会直接影响到简介发起调用的那些类。
下面举个生活中的实例:一个公司部门,有一个经理来充当调停者,其下的员工充当互相作用的类,这是一个很形象的实例。如果所有职员之间的互动都由职工之间直接进行,一旦某个员工不在,那么必须由此员工操作的事情便无法互动起来,或者某个员工被更换,员工之间不熟悉,也无法进行互动,这样,经理这个调停者的作用就来了,发起需求的员工将需求告诉经理,经理再找其他员工操作这个需求,明显的调停者模式。
下面看看示例代码:
调停者接口:Mediator
/**
* 调停者接口
*/
public interface Mediator {
void change(String message,ZhiYuan zhiyuan,String nname);
}
职工抽象类:ZhiYuan
/**
* 职员接口
*/
public abstract class ZhiYuan {
String name;
private Mediator mediator;
public ZhiYuan(Mediator mediator,String name){
this.mediator = mediator;
this.name = name;
}
//被调停者调用的方法
public void called(String message,String nname){
System.out.println(name + "接收到来自"+ nname + "的需求:" + message);
}
//调用调停者
public void call(String message,ZhiYuan zhiyuan,String nname){
System.out.println(nname + "发起需求:"+ message);
mediator.change(message,zhiyuan,nname);
}
}
具体的调停者:Jingli
/**
* 调停者:经理
*/
public class Jingli implements Mediator {
@Override
public void change(String message,ZhiYuan zhiyuan,String nname) {
System.out.println("经理收到" + nname + "的需求:" + message);
System.out.println("经理将" + nname + "的需求发送给目标职员");
zhiyuan.called(message,nname);
}
}
具体的职员:ZhiyuanA、ZhiyuanB、ZhiyuanC
/**
* 职员A
*/
public class ZhiyuanA extends ZhiYuan {
public ZhiyuanA(Mediator mediator, String name) {
super(mediator, name);
}
} /**
* 职员B
*/
public class ZhiyuanB extends ZhiYuan {
public ZhiyuanB(Mediator mediator, String name) {
super(mediator, name);
}
} /**
* 职员C
*/
public class ZhiyuanC extends ZhiYuan {
public ZhiyuanC(Mediator mediator, String name) {
super(mediator, name);
}
}
测试类:Clienter
public class Clienter {
public static void main(String[] args) {
//分配职员与经理
Mediator jingli = new Jingli();
ZhiYuan zhiyuanA = new ZhiyuanA(jingli,"职员A");
ZhiYuan zhiyuanB = new ZhiyuanB(jingli,"职员B");
ZhiYuan zhiyuanC = new ZhiyuanC(jingli,"职员C");
//职员A的需求
String messageA = "这些资料需要B职员操作";
zhiyuanA.call(messageA,zhiyuanB,zhiyuanA.name);
//职员C的请求
String messageC = "这些资料需要B职员签名";
zhiyuanC.call(messageC, zhiyuanB,zhiyuanC.name);
}
}
执行结果:
职员A发起需求:这些资料需要B职员操作
经理收到职员A的需求:这些资料需要B职员操作
经理将职员A的需求发送给目标职员
职员B接收到来自职员A的需求:这些资料需要B职员操作
职员C发起需求:这些资料需要B职员签名
经理收到职员C的需求:这些资料需要B职员签名
经理将职员C的需求发送给目标职员
职员B接收到来自职员C的需求:这些资料需要B职员签名
如上所列,职工A和职工C都需要请求职工B,但是假如他们不认识职工B,那么就将工作需求提交给经理,经理再将工作需求发送给职工B。
使用调停者模式貌似要比原本的结构消耗时间,但是却将需求的发起者与执行者之间的强耦合进行了降低,极大的优化了系统内部的维护工作。
调停者模式降低的是系统内部的耦合性,而外观模式降低的是系统之间的耦合性。
调停者模式更加细化,针对的是系统内部类与类之间的强耦合的解除,外观模式则较为统筹,针对的是整个系统对外的耦合性解除,二者都都有屏蔽复杂性的作用。
同系列文章:
- Java设计模式之《适配器模式》及应用场景
- Java设计模式之《外观模式》及应用场景
- Java设计模式之《桥接模式》及应用场景
- Java设计模式之《单例模式》及应用场景
- Java设计模式之《观察者模式》及应用场景
- Java设计模式之《调停者模式》及应用场景
- Java设计模式之《代理模式》及应用场景
- Java设计模式之《职责链模式》及应用场景
- Java设计模式之《享元模式》及应用场景
- Java设计模式之《构建者模式》及应用场景
- Java设计模式之《模板模式》及使用场景
- Java设计模式之《装饰器模式》及应用场景
- Java设计模式之《工厂方法模式》及使用场景
- Java设计模式之《抽象工厂模式》及使用场景
Java设计模式之《调停者模式》及应用场景的更多相关文章
- java设计模式之组合模式
组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...
- Java设计模式应用——组合模式
组合模式实际上是一种树形数据结构.以windows目录系统举例,怎么样用java语言描述一个文件夹? 定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类. 进一步抽象,把文件夹和文件都看做节 ...
- java设计模式5.组合模式、门面模式、享元模式、桥接模式
组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...
- JAVA设计模式之组合模式(composite)
组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...
- 老和尚给小和尚讲故事引发了Java设计模式:组合模式
目录 示例 组合模式 定义 意图 主要解决问题 优缺点 安全式和透明式的组合模式 安全式的合成模式的结构 透明式的合成模式的结构 老和尚和小和尚的故事 示例 有一个绘图系统,可以描绘各种图形,假设现在 ...
- Java设计模式之模板模式及使用场景
模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
随机推荐
- JS-鼠标滚轮事件 和 阻止默认行为
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- printf 格式化输出
i,d 十进制整数 x,X 十六进制无符号整数 o 八进制无符号整数 u 无符号十进制整数 c 单一字符 s 字符串 e E 指数形式浮 ...
- 在VMWare虚拟机中安装Ubuntu 16.04.1 LTS
一.需要的准备 安装好VMWare虚拟机(傻瓜式安装,一直next就可以,请支持正版),将Ubuntu的系统镜像下载好,目前最新的LTS版本为16.04.1. 我把虚拟机和Ubuntu镜像传到了百度云 ...
- ArcGIS Pro 简明教程(4)工具和模型构建器
ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...
- 写给Java开发者的Node.JS简介
前言 今天上推特看见这篇文章,点进去发现是新货. 正好最近想入Node的坑,又有一些Java基础,所以希望翻译出来给大家,同时也让自己加深理解. 才疏学浅,如有不妥之处请指正. 原文链接:Node f ...
- PHP面向对象编程简单实例
<?php date_default_timezone_set("PRC"); /** 1.静态属性用于保存类的公有数据* 2.静态方法里面只能访问静态属性* 3.静态成员 ...
- ZooKeeper 学习笔记
ZooKeeper学习笔记 1. zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...
- Java(多态练习 instanceof)
/* 题目: (多态,instanceof)有如下代码 class Animal { private String name; // 1 } class Dog extends Animal { // ...
- javascript的方法
1. decodeURIComponent() decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码. 语法: decodeURI ...
- load & get 加载方式
1.Hibernate中get和load有什么不同之处? (1)Hibernate的get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数 ...