前言:【模式总览】——————————by xingoo

  模式意图

  使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。

  这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌!

  应用场景

  1 当一组对象要进行沟通或者业务上的交互,但是其关系却又很复杂混乱时,可以采用此模式。

  2 当一个对象与其他的对象要进行紧密的交互,但又想服用该对象而不依赖其他的对象时。

  3 想创造一个运行于多个类之间的对象,又不想生成新的子类时。

  模式结构

  

  Mediator 抽象的中介者,定义中介的规范

  1. interface Mediator{
  2. public void colleagueChanged(Colleague c);
  3. }

  ConcreteMediator 具体的中介者,通常内部依赖于多个业务对象

  1. class ConcreteMediator implements Mediator{
  2. private Colleague1 col1;
  3. private Colleague2 col2;
  4. public void colleagueChanged(Colleague c) {
  5. col1.action();
  6. col2.action();
  7. }
  8. public void createConcreteMediator() {
  9. col1 = new Colleague1(this);
  10. col2 = new Colleague2(this);
  11. }
  12. private Colleague1 getCol1() {
  13. return col1;
  14. }
  15. public Colleague2 getCol2() {
  16. return col2;
  17. }
  18. }

  Colleague 抽象的业务角色

  1. abstract class Colleague{
  2. private Mediator mediator;
  3. public Colleague(Mediator mediator){
  4. this.mediator = mediator;
  5. }
  6. public Mediator getMediator() {
  7. return mediator;
  8. }
  9. public abstract void action();
  10. public void change(){
  11. mediator.colleagueChanged(this);
  12. }
  13. }

  Colleague1 Colleague2 具体的业务角色

  1. class Colleague1 extends Colleague{
  2. public Colleague1(Mediator m){
  3. super(m);
  4. }
  5. public void action(){
  6. System.out.println("this is an action from Colleague1");
  7. }
  8. }
  9. class Colleague2 extends Colleague{
  10. public Colleague2(Mediator m){
  11. super(m);
  12. }
  13. public void action(){
  14. System.out.println("this is an action from Colleague2");
  15. }
  16. }

  全部代码

  1. package com.xingoo.test.design.mediator;
  2. abstract class Colleague{
  3. private Mediator mediator;
  4.  
  5. public Colleague(Mediator mediator){
  6. this.mediator = mediator;
  7. }
  8.  
  9. public Mediator getMediator() {
  10. return mediator;
  11. }
  12.  
  13. public abstract void action();
  14.  
  15. public void change(){
  16. mediator.colleagueChanged(this);
  17. }
  18. }
  19. class Colleague1 extends Colleague{
  20. public Colleague1(Mediator m){
  21. super(m);
  22. }
  23. public void action(){
  24. System.out.println("this is an action from Colleague1");
  25. }
  26. }
  27. class Colleague2 extends Colleague{
  28. public Colleague2(Mediator m){
  29. super(m);
  30. }
  31. public void action(){
  32. System.out.println("this is an action from Colleague2");
  33. }
  34. }
  35. interface Mediator{
  36. public void colleagueChanged(Colleague c);
  37. }
  38. class ConcreteMediator implements Mediator{
  39. private Colleague1 col1;
  40. private Colleague2 col2;
  41.  
  42. public void colleagueChanged(Colleague c) {
  43. col1.action();
  44. col2.action();
  45. }
  46.  
  47. public void createConcreteMediator() {
  48. col1 = new Colleague1(this);
  49. col2 = new Colleague2(this);
  50. }
  51.  
  52. private Colleague1 getCol1() {
  53. return col1;
  54. }
  55.  
  56. public Colleague2 getCol2() {
  57. return col2;
  58. }
  59.  
  60. }
  61.  
  62. public class Client {
  63. public static void main(String[] args) {
  64. ConcreteMediator mediator = new ConcreteMediator();
  65. mediator.createConcreteMediator();
  66. Colleague1 col1 = new Colleague1(mediator);
  67. // Colleague2 col2 = new Colleague2(mediator);
  68. mediator.colleagueChanged(col1);
  69. }
  70. }

  运行结果

  1. this is an action from Colleague1
  2. this is an action from Colleague2

  生活中的设计模式

  

  毕业的同学们,第一个要解决的问题就是租房子,当白富美高富帅出没社会后,穷屌丝没了生存之地。但是只要勤劳,一样有饭吃有房住!

  这里房屋中介好比是一个中介者,它知道每个租客的身份信息,当有房屋出租后,它会发送给每一个租客消息。

  这样,租客们中有一个变化活动时,都会利用房屋中介,发送消息到其他的租客。下面就是模仿的一个过程。

  房屋中介代码如下:

  1. interface StateMediator{
  2. public void sell(Tenant tenant);
  3. }
  4. class RealEstateAgents implements StateMediator{
  5. private TenantA teA;
  6. private TenantB teB;
  7. private TenantC teC;
  8.  
  9. public void sell(Tenant tenant) {
  10. System.out.println("海景洋房 已经租出去了!");
  11. if(tenant instanceof TenantA){
  12. teB.crying();
  13. teC.crying();
  14. }else if(tenant instanceof TenantB){
  15. teA.crying();
  16. teC.crying();
  17. }else if(tenant instanceof TenantC){
  18. teB.crying();
  19. teA.crying();
  20. }
  21. }
  22.  
  23. public void createAgents(){
  24. teA = new TenantA(this);
  25. teB = new TenantB(this);
  26. teC = new TenantC(this);
  27. }
  28. }

  租客的代码如下:

  1. abstract class Tenant{
  2. private RealEstateAgents agent;
  3. public Tenant(RealEstateAgents agent) {
  4. this.agent = agent;
  5. }
  6. public abstract void crying();
  7. public void renting(){
  8. agent.sell(this);
  9. }
  10. }
  11. class TenantA extends Tenant{
  12. public TenantA(RealEstateAgents agent) {
  13. super(agent);
  14. }
  15. public void crying() {
  16. System.out.println("我是高富帅 TenantA!哎呀我想要!");
  17. }
  18. }
  19. class TenantB extends Tenant{
  20. public TenantB(RealEstateAgents agent) {
  21. super(agent);
  22. }
  23. public void crying() {
  24. System.out.println("我是白富美 TenantB!哎呀我想要!");
  25. }
  26. }
  27. class TenantC extends Tenant{
  28. public TenantC(RealEstateAgents agent) {
  29. super(agent);
  30. }
  31. public void crying() {
  32. System.out.println("我是穷屌丝 TenantC!哎呀我想要!");
  33. }
  34. }

  产生的业务活动如下:

  1. public class ClientTest {
  2. public static void main(String[] args) {
  3. RealEstateAgents agent = new RealEstateAgents();
  4. agent.createAgents();
  5.  
  6. System.out.println("TeA 抢到了房子了!");
  7. agent.sell(new TenantA(agent));
  8.  
  9. System.out.println("过了两个月 TeB 抢到了房子了!");
  10. agent.sell(new TenantB(agent));
  11. }
  12. }

  运行结果

  1. TeA 抢到了房子了!
  2. 海景洋房 已经租出去了!
  3. 我是白富美 TenantB!哎呀我想要!
  4. 我是穷屌丝 TenantC!哎呀我想要!
  5. 过了两个月 TeB 抢到了房子了!
  6. 海景洋房 已经租出去了!
  7. 我是高富帅 TenantA!哎呀我想要!
  8. 我是穷屌丝 TenantC!哎呀我想要!

【设计模式】—— 中介者模式Mediator的更多相关文章

  1. 设计模式-中介者模式(Mediator)

    场景分析: 众所周知,电脑有很多组成部分,如硬盘.内存.光驱.音频.键盘等,各个组件之间协同工作才能保证电脑的正常运行. 如果各个组件之间直接交互,可能会比较复杂,如下图: 将上面的各个组件抽象成类, ...

  2. 大话设计模式--中介者模式 Mediator --C++实现实例

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

  3. 23种设计模式--中介者模式-Mediator Pattern

    一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...

  4. 深入浅出设计模式——中介者模式(Mediator Pattern)

    模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...

  5. 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...

  6. 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...

  7. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  8. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. 二十四种设计模式:中介者模式(Mediator Pattern)

    中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...

  10. JAVA 设计模式 中介者模式

    用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...

随机推荐

  1. ssh推送.py程序到服务器端运行

    C:\Users\jiangshan>ssh jiangshan@192.168.1.191jiangshan@192.168.1.191's password:Last login: Sun ...

  2. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

  3. Jmeter—实现识别验证码登录

    在做自动化测试或压力测试时,验证码总是一个问题.在以往的压力测试经历中,测试一般在独立的测试环境中进行,可以放心禁用验证码或使用万能验证码,这个是最实用的.但是,这两天我尝试了一个使用第三方的图形图像 ...

  4. ansible 远程以普通用户执行命令

    1. ansible 10.0.0.1 -m raw -a "date" -u www 2.在ansible的主机配置文件中指定ssh_uservi/etc/ansible/hos ...

  5. jqgrid 配置分页大小及下拉项

    如何配置分页大小的下拉项?显示效果如下: 通过 rowNum 来设置默认分页大小 通过 rowList 来设置分页下拉.   rowList 的值为一个数组,比如:[10,20,30] $(" ...

  6. Linux系统扫描技术及安全防范

    1.概述 一.主机扫描 二.路由扫描 三.批量服务扫描 四.linux防范恶意扫描安全策略 一个典型的网络安全事件 ·案例:通过网络扫描方式获取某运营商核心设备管理权限 step01:通过tracer ...

  7. Delphi 7~XE系列升级安装Indy10.6

    由于低版本Indy无法满足网络技术的日益更新,如SSL/TLS请求.RawHeaders与Cookie管理等问题处理. 我本身一直在用Delphi 2007,因为D2009开始底层的编码已不同,旧项目 ...

  8. kettle学习笔记(十)——数据检验、统计、分区与JS脚本

    一.概述 数据剖析和数据检验: 用于数据的检查.清洗 . 统计步骤: 提供数据采样和统计的功能 分区: 根据数据里某个字段的值,拆分成多个数据块.输出到不同的库表和文件中. 脚本: Javascrip ...

  9. Android开发——RecyclerView特性以及基本使用方法(二)

    0.  前言 随着Android的发展,虽然ListView依旧重要,但RecyclerView确实越来越多的被大家使用.但显然并不能说RecyclerView就一定优于ListView,而是应该根据 ...

  10. C语言学习之联合类型

    前言 联合(union)是一种特殊的数据类型,和结构体很像,结构体各成员变量有自己独立的存储位置,而联合的成员变量共享同一片存储区域,因此联合变量再一个时刻只能保存它的某一个成员的值. 联合的定义和初 ...