java设计模式-中介者模式
模式导读:
在一个班级里面会有多位管理层的成员,可分为学习委员,生活委员,心理委员等等,它们的任务不同,但是也会有一定的联系,这些联系可能会像下图这样:
这样看过去是不是感觉很凌乱,它们的关系也很难一时区分开,所以我们有了班长这个中介者角色,由他接收每一位学委反馈的信息并通知给相关学委,这样处理简直不要太轻松!
核心:
1.如果一个对象中对象之间的联系呈现为网状结构,对象之间存在大量多对多的关系,将导致关系极其复杂,这些对象被称为“同事对象”.
2.我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为星形结构。
参考类图:
代码实现:
1.定义一个中介者接口以及相关方法
1 package com.etc; 2 //中介者接口类 3 public interface Mediator { 4 //注册委员 5 void register(String lname,ClassLeader c); 6 //班长根据委员名字获得通知请求 7 void command(String lname); 8 9 }
2.定义一个学委的接口以及相关方法
1 package com.etc; 2 //班干部接口 3 public interface ClassLeader { 4 //本职工作 5 void job(); 6 //向班长提出请求 7 void sendRequest(); 8 }
3.具体学委角色
1 package com.etc; 2 //生活委员 3 public class LifeLeader implements ClassLeader { 4 //持有对班长大人的引用 5 private Mediator media; 6 7 public LifeLeader(Mediator media) { 8 super(); 9 this.media = media; 10 media.register("LifeLeader", this); 11 } 12 13 @Override 14 public void job() { 15 System.out.println("生活委员->小张最近生活作风有点问题,需要我的帮助!"); 16 } 17 18 @Override 19 public void sendRequest() { 20 System.out.println("生活委员->小张是不是有什么精神负担,班长大人去叫心理委员去看看什么情况吧!"); 21 media.command("phycologic"); 22 } 23 }
1 package com.etc; 2 //心理委员 3 public class PhychologicalLeader implements ClassLeader { 4 //持有对班长大人的引用 5 private Mediator media; 6 public PhychologicalLeader(Mediator media) { 7 super(); 8 this.media = media; 9 media.register("phycologic", this); 10 } 11 12 @Override 13 public void job() { 14 System.out.println("心理委员->小张最近心情好像不太好,需要我的帮助!"); 15 } 16 17 @Override 18 public void sendRequest() { 19 System.out.println("心理委员->小张是不是生活上有什么问题,班长大人叫生活委员多关注一下吧!"); 20 media.command("LifeLeader"); 21 } 22 23 }
1 package com.etc; 2 //学习委员 3 public class StudyLeader implements ClassLeader { 4 //持有对班长大人的引用 5 private Mediator media; 6 7 public StudyLeader(Mediator media) { 8 super(); 9 this.media = media; 10 media.register("StudyLeader", this); 11 } 12 13 @Override 14 public void job() { 15 System.out.println("学习委员->小张最近成绩突飞猛进,果然在我的英明指导下没有人能不起飞!"); 16 } 17 18 @Override 19 public void sendRequest() { 20 System.out.println("学习委员->小张为了成绩居然还搞抄袭,怎么变成这样了?班长大人快去通知生活委员和心理委员看看情况!"); 21 media.command("LifeLeader"); 22 media.command("phycologic"); 23 } 24 }
4.具体中介者角色
1 package com.etc; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 //班长 7 public class ClassMonitor implements Mediator { 8 //利用map集合存放学委的相关属性 9 private Map<String,ClassLeader> map=new HashMap<String,ClassLeader>(); 10 11 //将对应名称的学委对象进行注册 12 @Override 13 public void register(String lname, ClassLeader c) { 14 map.put(lname, c); 15 } 16 //班长大人获取来自指定学委的请求通知 17 @Override 18 public void command(String lname) { 19 map.get(lname).job(); 20 } 21 }
5.客户端类
1 package com.etc; 2 3 public class Client { 4 5 public static void main(String[] args) { 6 7 Mediator m=new ClassMonitor(); 8 ClassLeader life=new LifeLeader(m); 9 ClassLeader study=new StudyLeader(m); 10 ClassLeader phycho=new PhychologicalLeader(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、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。