Java

头一次见有人把java设计模式——中介者模式讲得这么透彻

2021-01-18  本文已影响0人  程序花生

基本需求

传统方案

各个类之间相互调用,依赖严重,消息传递不准确,调用结构混乱

基本介绍

中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

中介者模式属于行为型模式,使代码易于维护

比如MVC模式,C(Controller 控制器)是M(Model 模型)和V(View 视图)的中介者,在前后端交互时起到了中间人的作用

比如租房子

UML类图(原理)

UML类图(案例)

代码实现

public abstract class Mediator {

   // 中介者抽象类

   // 将同事类加入到中介者中,由中介者对所有同事类进行交互,同事类之间不进行交互
   // 将依赖由网状变成星状
   public abstract void register(String colleagueName, Colleague colleague);

   // 接收消息 由同事类发出
   public abstract void getMessage(String colleagueName, int stateChange);

   // 发送消息,发给同事类,本次案例中没有用到
   public abstract void sendMessage();

}

// 中介者实现类
public class ConcreteMediator extends Mediator {

   // 使用集合管理所有的中介者,如果key重复,则是最新注册的 ,可否弄成MapList的形式管理重复key
   private Map<String, Colleague> colleagueMap;

   // 名称的集合,方便我们自己获取对应的同事类,因为每次注册时 我们并不知道key,想获取value时不能获取,指定名称 后续使用简单
   private Map<String, String> nameMap;

   public ConcreteMediator() {
       this.colleagueMap = new HashMap<>();
       this.nameMap = new HashMap<>();
   }

   @Override
   public void register(String colleagueName, Colleague colleague) {
       colleagueMap.put(colleagueName, colleague);
       if (colleague instanceof Alarm) {
           // 自定义名称 方便我们下面使用
           nameMap.put("alarm", colleagueName);
       } else if (colleague instanceof CoffeeMachine) {
           nameMap.put("coffeeMachine", colleagueName);
       } else if (colleague instanceof Curtain) {
           nameMap.put("curtain", colleagueName);
       } else if (colleague instanceof TV) {
           nameMap.put("tv", colleagueName);
       }
   }

   @Override
   public void getMessage(String colleagueName, int stateChange) {
       // 根据得到消息,完成对应任务,中介者在这个方法,协调各个具体的同事对象,完成任务
       if (colleagueMap.get(colleagueName) instanceof Alarm) {
           // 处理闹钟的消息 可使用中介者的sendMessage方法进行处理
           if (stateChange == 0) {
               ((CoffeeMachine) colleagueMap.get(nameMap.get("coffeeMachine"))).startCoffee();
               ((TV) colleagueMap.get(nameMap.get("tv"))).startTv();
           } else if (stateChange == 1) {
               ((TV) colleagueMap.get(nameMap.get("tv"))).stopTv();
           }
       } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {
           // 处理咖啡机的消息
           if (stateChange == 0) {
               ((Curtain) colleagueMap.get(nameMap.get("curtain"))).upCurtains();
           }
       } else if (colleagueMap.get(colleagueName) instanceof Curtain) {
           // 处理窗帘的消息
           System.out.println();
       } else if (colleagueMap.get(colleagueName) instanceof TV) {
           // 处理电视机的消息
           System.out.println();
       }
   }

   @Override
   public void sendMessage() {

   }
}
public abstract class Colleague {

   // 同事抽象类

   protected String name;

   private Mediator mediator;

   public Colleague(String name, Mediator mediator) {
       this.name = name;
       this.mediator = mediator;
   }

   public Mediator getMediator() {
       return this.mediator;
   }

   // 发送消息
   public abstract void sendMessage(int stateChange);

}

// 同事子类一 闹钟类
public class Alarm extends Colleague {

   public Alarm(String name, Mediator mediator) {
       super(name, mediator);
       // 将自己在中介者中进行注册
       mediator.register(name, this);
   }

   @Override
   public void sendMessage(int stateChange) {
       // 获取中介者 调用中介者的getMessage方法 将消息传递给中介者 由中介者处理消息
       this.getMediator().getMessage(super.name, stateChange);
   }

   public void sendAlarm(int stateChange) {
       sendMessage(stateChange);
   }
}

// 同事子类二 咖啡机
public class CoffeeMachine extends Colleague {

   public CoffeeMachine(String name, Mediator mediator) {
       super(name, mediator);
       mediator.register(name, this);
   }

   @Override
   public void sendMessage(int stateChange) {
       this.getMediator().getMessage(super.name, stateChange);
   }

   public void startCoffee() {
       System.out.println("It's time to startcoffee!");
   }

   public void finishCoffee() {
       System.out.println("After 5 minutes!");
       System.out.println("Coffee is ok!");
       sendMessage(0);
   }
}

// 同事子类三 窗帘
public class Curtain extends Colleague {

   public Curtain(String name, Mediator mediator) {
       super(name, mediator);
       mediator.register(name, this);
   }

   @Override
   public void sendMessage(int stateChange) {
       this.getMediator().getMessage(super.name, stateChange);
   }

   public void upCurtains() {
       System.out.println("I am holding Up Curtains!");
   }
}

// 同事子类四 电视机
public class TV extends Colleague {

   public TV(String name, Mediator mediator) {
       super(name, mediator);
       mediator.register(name, this);
   }

   @Override
   public void sendMessage(int stateChange) {
       this.getMediator().getMessage(super.name, stateChange);
   }

   public void startTv() {
       System.out.println("It's time to StartTv!");
   }

   public void stopTv() {
       System.out.println("Stop Tv!");
   }
}

注意事项

作者:xiaokantianse

链接:https://www.cnblogs.com/xiaokantianse/p/14293823.html

上一篇 下一篇

猜你喜欢

热点阅读