当前位置 博文首页 > 十四lin:设计模式(十九)——中介者模式(智能家庭案例)

    十四lin:设计模式(十九)——中介者模式(智能家庭案例)

    作者:十四lin 时间:2021-02-08 12:28

    1 智能家庭项目

    智能家庭项目:

    1) 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘

    2) 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放

    传统方案解决智能家庭管理问题

    传统的方式的问题分析

    1) 当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂

    2) 各个电器对象彼此联系,你中有我,我中有你,不利于松耦合.

    3) 各个电器对象之间所传递的消息(参数),容易混乱

    4) 当系统增加一个新的电器对象时或者执行流程改变时代码的可维护性扩展性都不理想考虑中介者模式

     

    中介者模式基本介绍

    基本介绍

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

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

    3) 比如 MVC 模式,CController 控制器 MModel 模型 VView 视图的中介者,在前后端交互时起到了中间人的作用

    中介者模式的原理类图

     

     

     对原理类图的说明-(中介者模式的角色及职责)

    1) Mediator 就是抽象中介者,定义了同事对象到中介者对象的接口

    2) Colleague 是抽象同事类

    3) ConcreteMediator 具体的中介者对象, 实现抽象方法, 他需要知道所有的具体的同事类,即以一个集合来管理

    HashMap,并接受某个同事对象消息,完成相应的任务

    4) ConcreteColleague 具体的同事类会有很多, 每个同事只知道自己的行 而不了解其他同事类的行为(方法) 是他们都依赖中介者对象

    中介者模式应用实例-智能家庭管理

    1) 应用实例要求

    完成前面的智能家庭的项目,使用中介者模式

    2) 思路分析和图解(类图)

            

     

     

    3)MVC中的中介者思想

     

     

     

     4)代码实现

    package mediator;
    
    public abstract class Mediator {
    
        //将给中介者对象,加入到集合中
        public abstract void Register(String colleagueName, Colleague colleague);
    
        //接收消息, 具体的同事对象发出
        public abstract void GetMessage(int stateChange, String colleagueName);
    
    
        public abstract void SendMessage();
    }

     

    package mediator;
    
    //同事抽象类
    public abstract class Colleague {
    
        private Mediator mediator;
        public String name;
    
        public Colleague(Mediator mediator, String name) {
    
            this.mediator = mediator;
            this.name = name;
    
        }
    
        public Mediator GetMediator() {
            return this.mediator;
        }
    
        public abstract void SendMessage(int stateChange);
    }

     

    package mediator;
    
    //具体的同事类
    public class Alarm extends Colleague {
    
    //构造器
        public Alarm(Mediator mediator, String name) {
    
            super(mediator, name);
    //TODO Auto-generated constructor stub
    //在创建 Alarm 同事对象时,将自己放入到 ConcreteMediator 对象中[集合] mediator.Register(name, this);
        }
    
        public void SendAlarm(int stateChange) {
            SendMessage(stateChange);
        }
    
        @Override
        public void SendMessage(int stateChange) {
    //TODO Auto-generated method stub
    //调 用 的 中 介 者 对 象 的 getMessage this.GetMediator().GetMessage(stateChange, this.name);
        }
    
    }

     

    package mediator;
    
    
    public class CoffeeMachine extends Colleague {
    
        public CoffeeMachine(Mediator mediator, String name) {
            super(mediator, name);
    
    // TODO Auto-generated constructor stub mediator.Register(name, this);
        }
    
        @Override
        public void SendMessage(int stateChange) {
    // TODO Auto-generated method stub this.GetMediator().GetMessage(stateChange, this.name);
        }
    
        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);
        }
    }

     

    package mediator;
    
    public class Curtains extends Colleague {
    
        public Curtains(Mediator mediator, String name) {
            super(mediator, name);
        }
    
        @Override
        public void SendMessage(int stateChange) {
            // this.name);
        }
    
        public void UpCurtains() {
            System.out.println("I am holding Up Curtains!");
        }
    
    }

     

    package mediator;
    
    public class TV extends Colleague {
    
        public TV(Mediator mediator, String name) {
            super(mediator, name);
            mediator.Register(name, this);
    
        }
    
        @Override
        public void SendMessage(int stateChange) {
        }
    
        public void StartTv() {
        }
    
        public void StopTv() {
        }
    }