ToB企服应用市场:ToB评测及商务社交产业平台

标题: 中介者模式 [打印本页]

作者: 卖不甜枣    时间: 2023-10-17 17:16
标题: 中介者模式
中介者模式

案例引入

要求

传统方式实现案例

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

中介者模式基本介绍

原理类图


角色分析

中介者实现案例代码
  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. }
复制代码
注意事项和细节


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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4