模式导读:

在一个班级里面会有多位管理层的成员,可分为学习委员,生活委员,心理委员等等,它们的任务不同,但是也会有一定的联系,这些联系可能会像下图这样:

这样看过去是不是感觉很凌乱,它们的关系也很难一时区分开,所以我们有了班长这个中介者角色,由他接收每一位学委反馈的信息并通知给相关学委,这样处理简直不要太轻松!

核心:

1.如果一个对象中对象之间的联系呈现为网状结构,对象之间存在大量多对多的关系,将导致关系极其复杂,这些对象被称为“同事对象”.

2.我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为星形结构。

参考类图:

代码实现:

1.定义一个中介者接口以及相关方法

1 packagecom.etc;2 //中介者接口类

3 public interfaceMediator {4 //注册委员

5 voidregister(String lname,ClassLeader c);6 //班长根据委员名字获得通知请求

7 voidcommand(String lname);8

9 }

2.定义一个学委的接口以及相关方法

1 packagecom.etc;2 //班干部接口

3 public interfaceClassLeader {4 //本职工作

5 voidjob();6 //向班长提出请求

7 voidsendRequest();8 }

3.具体学委角色

1 packagecom.etc;2 //生活委员

3 public class LifeLeader implementsClassLeader {4 //持有对班长大人的引用

5 privateMediator media;6

7 publicLifeLeader(Mediator media) {8 super();9 this.media =media;10 media.register("LifeLeader", this);11 }12

13 @Override14 public voidjob() {15 System.out.println("生活委员->小张最近生活作风有点问题,需要我的帮助!");16 }17

18 @Override19 public voidsendRequest() {20 System.out.println("生活委员->小张是不是有什么精神负担,班长大人去叫心理委员去看看什么情况吧!");21 media.command("phycologic");22 }23 }

1 packagecom.etc;2 //心理委员

3 public class PhychologicalLeader implementsClassLeader {4 //持有对班长大人的引用

5 privateMediator media;6 publicPhychologicalLeader(Mediator media) {7 super();8 this.media =media;9 media.register("phycologic", this);10 }11

12 @Override13 public voidjob() {14 System.out.println("心理委员->小张最近心情好像不太好,需要我的帮助!");15 }16

17 @Override18 public voidsendRequest() {19 System.out.println("心理委员->小张是不是生活上有什么问题,班长大人叫生活委员多关注一下吧!");20 media.command("LifeLeader");21 }22

23 }

1 packagecom.etc;2 //学习委员

3 public class StudyLeader implementsClassLeader {4 //持有对班长大人的引用

5 privateMediator media;6

7 publicStudyLeader(Mediator media) {8 super();9 this.media =media;10 media.register("StudyLeader", this);11 }12

13 @Override14 public voidjob() {15 System.out.println("学习委员->小张最近成绩突飞猛进,果然在我的英明指导下没有人能不起飞!");16 }17

18 @Override19 public voidsendRequest() {20 System.out.println("学习委员->小张为了成绩居然还搞抄袭,怎么变成这样了?班长大人快去通知生活委员和心理委员看看情况!");21 media.command("LifeLeader");22 media.command("phycologic");23 }24 }

4.具体中介者角色

1 packagecom.etc;2

3 importjava.util.HashMap;4 importjava.util.Map;5

6 //班长

7 public class ClassMonitor implementsMediator {8 //利用map集合存放学委的相关属性

9 private Map map=new HashMap();10

11 //将对应名称的学委对象进行注册

12 @Override13 public voidregister(String lname, ClassLeader c) {14 map.put(lname, c);15 }16 //班长大人获取来自指定学委的请求通知

17 @Override18 public voidcommand(String lname) {19 map.get(lname).job();20 }21 }

5.客户端类

1 packagecom.etc;2

3 public classClient {4

5 public static voidmain(String[] args) {6

7 Mediator m=newClassMonitor();8 ClassLeader life=newLifeLeader(m);9 ClassLeader study=newStudyLeader(m);10 ClassLeader phycho=newPhychologicalLeader(m);11 //当前委员发送请求给班长然后通过班长与其他委员通信

12 System.out.println("------生活委员->班长->心理委员------");13 life.sendRequest();14 System.out.println("--------------------------");15 System.out.println("------学习委员->班长->心理委员,生活委员------");16 study.sendRequest();17 System.out.println("--------------------------");18 System.out.println("------心理委员->班长->生活委员------");19 phycho.sendRequest();20 System.out.println("--------------------------");21

22

23 }24

25 }

效果截图:

中介者模式优缺点:

优点:

1、降低了类的复杂度,将一对多转化成了一对一。

2、各个类之间的解耦。

3、符合迪米特原则。

缺点:

中介者会庞大,变得复杂难以维护。

适用场景:

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。

2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

java 中介模式_java设计模式-中介者模式相关推荐

  1. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. java解耦的模板模式_Java 设计模式(9) —— 模板模式

    一.模板模式 封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现.模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板模式 二.示例 泡咖啡与泡茶: 泡咖啡的步骤: 水 ...

  3. Java创新型模式_java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  4. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  5. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  6. java策略模式_Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...

  7. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

  8. java bridge 模式_Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  9. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  10. java模板方法模式_java设计模式(模板方法模式)

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

最新文章

  1. Android深度探索与驱动开发(一)
  2. CVE-2010-3333
  3. MySQL常见错误代码及代码说明
  4. 【C++】this指针
  5. 电脑教程从入门到精通_如何自学原画设计|新手如何开始学原画?(附视频教程从入门到精通)...
  6. ACES学院色彩编码在影片中的应用
  7. 伪分布式kafka安装与验证
  8. Unity延迟和重复调用方法
  9. php的数组操作,PHP的数组操作
  10. evt参数是干啥用的_女朋友问我,Java8 Optional 到底干啥用的?
  11. 网页布局02 盒子模型
  12. 无法创建java虚拟机_java虚拟机创建失败的原因整理
  13. 阿里云mysql可视化_MySql可视化工具MySQL Workbench使用教程
  14. 再谈回声消除测评丨Dev for Dev 专栏
  15. 键盘上打出省略号的方法
  16. LDA变分法和采样法
  17. mac系统下查看端口占用问题的解决方案
  18. k8s的Scheduler 原理(预选策略、优选策略)
  19. ECCV2022论文汇总:检测/分割/跟踪/3D/深度估计/姿态解算等多个方向!
  20. 个人项目——中小学数学卷子自动生成程序

热门文章

  1. 远程服务器连接计算机和用户名填写,windos系统服务器:添加远程连接用户名方法...
  2. html悬挂缩进2字符,文章中如何设置悬挂缩进2字符
  3. 最小生成树(Minimum Spanning Tree)的原理及实现(Java)
  4. 网上资源之WEB前端
  5. MySQL高级篇——锁的概述与案例应用
  6. 如何提升Excel水平?5个Excel常用技巧,学会不加班
  7. java8新特性之一:流式数据处理(包含list,map数据处理)。
  8. 小程序中图片的移动、旋转和缩放功能
  9. Android Studio插入图片
  10. [Python从零到壹] 四十四.图像增强及运算篇之图像灰度线性变换详解