模式导读:
在一个班级里面会有多位管理层的成员,可分为学习委员,生活委员,心理委员等等,它们的任务不同,但是也会有一定的联系,这些联系可能会像下图这样:
这样看过去是不是感觉很凌乱,它们的关系也很难一时区分开,所以我们有了班长这个中介者角色,由他接收每一位学委反馈的信息并通知给相关学委,这样处理简直不要太轻松!
核心:
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、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。