java 中介模式_java设计模式-中介者模式

本文通过一个班级管理的例子介绍了中介者模式的应用,它将原本复杂的一对多对象交互转化为简单的一对一交互,降低了类的复杂度,实现了各对象间的解耦。在代码实现中,班长作为中介者接收并协调各学委(学习委员、生活委员、心理委员)的工作,使得系统结构更加清晰。中介者模式适用于处理对象间复杂引用关系的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式导读:

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

bbb825afe33eec15e5f93eb1150f3ebd.png

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

3694946555a9dbe7a07c7d698c129c98.png

核心:

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

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

参考类图:

f1bbc4ce41cf984f1ceee2aef2522d2f.png

代码实现:

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 }

效果截图:

bcf6240e5b9e02261599d35c7da9cfff.png

中介者模式优缺点:

优点:

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

2、各个类之间的解耦。

3、符合迪米特原则。

缺点:

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

适用场景:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值