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、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

posted @ 2019-05-19 18:55  无影云  阅读(976)  评论(0)    收藏  举报