中介者模式

打印 上一主题 下一主题

主题 932|帖子 932|积分 2796

中介者模式

案例引入

要求


  • 1.智能家庭包括设备,闹钟,咖啡机,窗帘等。
  • 2.主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为,闹钟响起-> 咖啡机开始做咖啡->窗帘自动落下->电视机开始播放。
传统方式实现案例

有闹钟类(Alarm),电视类(TV),窗帘类(Curtains),咖啡机(Coffee Machine),闹钟发消息给咖啡机,咖啡机发消息给窗帘,窗帘发消息给电视,来实现要求中的流程。
中介者模式和外观模式的区别,内部子系统是独立的。
传统方式问题分析


  • 1.当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂。
  • 2.各个电器对象间彼此联系,相互依赖,不利于松耦合。
  • 3.各个电器对象之间,所传递的消息多,很容易混乱。
  • 4.当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性,扩展性都不理想 -> 考虑使用中介者模式。
中介者模式基本介绍


  • 1.中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互引用,从而使其松耦合,而且可以独立地改变子系统之间的交互。
  • 2.中介者模式属于行为型模式,使代码易于维护。
  • 3.比如MVC模式,C(Controller 控制器)是M(Model 模型)和V(View 视图)的中介者,在前后端交互中起到了中间人的作用。
原理类图


角色分析


  • 1.Mediator是抽象的中介者类。
  • 2.Colleague是抽象的同事类,也可以看作是抽象的子系统的类。
  • 3.ConcreteMediator具体的中介者对象,实现抽象方法,他需要知道所有的具体子系统类,并以一个HashMap集合的方式来管理所有的同事对象消息,完成相应的操作。
  • 4.ConcreteColleague具体的同事类(子系统类),会有很多,每个同事(子系统)只知道自己的行为,而不了解其他同事类(子系统)的行为(方法) 但是这些对象都依赖中介者对象。
中介者实现案例代码
  1. /**
  2. * @author 长名06
  3. * @version 1.0
  4. * 中介者抽象类
  5. */
  6. public abstract class Mediator {
  7.     public abstract void register(String colleagueName,Colleague colleague);
  8.     public abstract void getMessage(int stateChange,String colleagueName);
  9.     public abstract void sendMessage();
  10. }
  11. /**
  12. * @author 长名06
  13. * @version 1.0
  14. * 具体的抽象者类
  15. */
  16. public class ConcreteMediator extends Mediator{
  17.     //hashMap集合,存储所有的子系统对象
  18.     private HashMap<String,Colleague> colleagueMap;
  19.     private HashMap<String,String> interMap;
  20.     public ConcreteMediator(){
  21.         colleagueMap = new HashMap<String,Colleague>();
  22.         interMap = new HashMap<String,String>();
  23.     }
  24.     @Override
  25.     public void register(String colleagueName, Colleague colleague) {
  26.         colleagueMap.put(colleagueName,colleague);
  27.         if(colleague instanceof Alarm)
  28.             interMap.put("Alarm",colleagueName);
  29.         else if(colleague instanceof CoffeeMachine)
  30.             interMap.put("CoffeeMachine",colleagueName);
  31.         else if(colleague instanceof TV)
  32.             interMap.put("TV",colleagueName);
  33.     }
  34.     /**
  35.      * 具体中介者的核心方法
  36.      * @param stateChange
  37.      * @param colleagueName
  38.      */
  39.     @Override
  40.     public void getMessage(int stateChange, String colleagueName) {
  41.         if(colleagueMap.get(colleagueName) instanceof Alarm){
  42.             if(stateChange == 0){
  43.                 ((CoffeeMachine) colleagueMap.get(interMap.get("CoffeeMachine"))).startCoffee();
  44.                 ((TV)colleagueMap.get(interMap.get("TV"))).startTV();
  45.             }else if(stateChange == 1){
  46.                 ((TV)colleagueMap.get(interMap.get("TV"))).stopTV();
  47.             }
  48.         } else if(colleagueMap.get(colleagueName) instanceof CoffeeMachine){
  49.             //TV发消息,代码没写全,理解这个思想即可
  50.         }else if(colleagueMap.get(colleagueName) instanceof TV){
  51.         }
  52.     }
  53.     @Override
  54.     public void sendMessage() {
  55.     }
  56. }
  57. /**
  58. * @author 长名06
  59. * @version 1.0
  60. * 子系统(同事)抽象类
  61. */
  62. public abstract class Colleague {
  63.     //持有中介者对象
  64.     private Mediator mediator;
  65.     //子系统name属性
  66.     public String name;
  67.     public Colleague(Mediator mediator,String name){
  68.         this.mediator = mediator;
  69.         this.name = name;
  70.     }
  71.     public Mediator getMediator(){
  72.         return this.mediator;
  73.     }
  74.     public abstract void sendMessage(int stateChange);
  75. }
  76. public class Alarm extends Colleague{
  77.     public Alarm(Mediator mediator,String name){
  78.         super(mediator,name);
  79.         mediator.register(name,this);
  80.     }
  81.     public void sendAlarm(int stateChange){
  82.         sendMessage(stateChange);
  83.     }
  84.     @Override
  85.     public void sendMessage(int stateChange) {
  86.         this.getMediator().getMessage(stateChange,this.name);
  87.     }
  88. }
  89. public class CoffeeMachine extends Colleague{
  90.     public CoffeeMachine(Mediator mediator,String name){
  91.         super(mediator,name);
  92.         mediator.register(name,this);
  93.     }
  94.     @Override
  95.     public void sendMessage(int stateChange) {
  96.         this.getMediator().getMessage(stateChange,this.name);
  97.     }
  98.     public void startCoffee(){
  99.         System.out.println("开始做咖啡");
  100.     }
  101.     public void finishCoffee(){
  102.         System.out.println("五分钟后");
  103.         System.out.println("咖啡制作完成");
  104.         sendMessage(0);
  105.     }
  106. }
  107. public class TV extends Colleague{
  108.     public TV(Mediator mediator,String name){
  109.         super(mediator,name);
  110.         mediator.register(name,this);
  111.     }
  112.     public void startTV(){
  113.         System.out.println("开启电视");
  114.     }
  115.     public void stopTV(){
  116.         System.out.println("关闭电视");
  117.     }
  118.     @Override
  119.     public void sendMessage(int stateChange) {
  120.         this.getMediator().getMessage(stateChange,this.name);
  121.     }
  122. }
  123. public class Client {
  124.     public static void main(String[] args) {
  125.         ConcreteMediator concreteMediator = new ConcreteMediator();
  126.         //创建Alarm对象,并加入到 ConcreteMediator的hashMap中
  127.         Alarm alarm = new Alarm(concreteMediator, "Alarm");
  128.         CoffeeMachine coffeeMachine = new CoffeeMachine(concreteMediator,"CoffeeMachine");
  129.         TV tV = new TV(concreteMediator, "TV");
  130.         alarm.sendMessage(0);
  131.         coffeeMachine.finishCoffee();
  132.         alarm.sendAlarm(1);
  133.     }
  134. }
复制代码
注意事项和细节


  • 1.多个类,相互耦合,会形成网状结构,使用中介者模式将网状结构分离为星型结构,进行解耦。
  • 2.减少类间依赖,降低了耦合,符合迪米特法则。
  • 3.中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响。
  • 4.如果设计不当,中介者对象本身变得过于复杂,这点在使用时,需格外注意。
    只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表