设计模式之中介者模式

中介者模式

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

电脑主板的功能就类似于一个中介者

经典中介者模式UML

例子

经典的中介者模式

复制代码
package com.tao.YanMoDesignPattern.Mediator.pattern;

/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description 中介者对象接口
 * @Version 1.0
 **/
public interface Mediator {

    /**
     * 同事对象在自身改变的时候来通知中介者的方法
     * 让中介者去负责相应的与其他同事对象的交互
     * @param colleague 同事对象自身,好让中介者对象通过对象实例去获取同事对象的状态
     */
    public void changed(Colleague colleague);
}

package com.tao.YanMoDesignPattern.Mediator.pattern;

/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description
 * @Version 1.0
 **/
public class ConcreteMediator implements Mediator{

    // 持有并维护同事A
    private ConreteColleagueA conreteColleagueA;
    // 持有并维护同事B
    private ConreteColleagueB conreteColleagueB;

    public void setConreteColleagueA(ConreteColleagueA conreteColleagueA) {
        this.conreteColleagueA = conreteColleagueA;
    }

    public void setConreteColleagueB(ConreteColleagueB conreteColleagueB) {
        this.conreteColleagueB = conreteColleagueB;
    }

    @Override
    public void changed(Colleague colleague) {
        // 某个同事发生了变化,通常需要与其他同事交互
        // 具体协调相应的同事对象来实现协作行为
    }
}

package com.tao.YanMoDesignPattern.Mediator.pattern;

/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description 同事类抽象类
 * @Version 1.0
 **/
public abstract class Colleague {

    // 持有中介者对象,每一个同事类都知道它的中介者对象
    private Mediator mediator;

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

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

}

package com.tao.YanMoDesignPattern.Mediator.pattern;

/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description
 * @Version 1.0
 **/
public class ConreteColleagueA extends Colleague{


    public ConreteColleagueA(Mediator mediator) {
        super(mediator);
    }

    /**
     * 示意方法,执行某些业务功能
     */
    public void someOperation(){
        // 在需要跟其他同事通信的时候,通知中介者对象
        getMediator().changed(this);
    }
}

package com.tao.YanMoDesignPattern.Mediator.pattern;

/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description
 * @Version 1.0
 **/
public class ConreteColleagueB extends Colleague{


    public ConreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    /**
     * 示意方法,执行某些业务功能
     */
    public void someOperation(){
        // 在需要跟其他同事通信的时候,通知中介者对象
        getMediator().changed(this);
    }
}

例子:电脑主板和各个部件关系

复制代码
package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;


/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description 中介者对象接口
 * @Version 1.0
 **/
public interface Mediator {

    /**
     * 同事对象在自身改变的时候来通知中介者的方法
     * 让中介者去负责相应的与其他同事对象的交互
     * @param colleague 主板
     */
    public void changed(Colleague colleague);
}

驱动

复制代码
package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;


/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description 光驱
 * @Version 1.0
 **/
public class CDDriver extends Colleague {


    public CDDriver(Mediator mediator) {
        super(mediator);
    }

   // 光驱读出来数据
    private String date = "";

    public String getDate() {
        return date;
    }

    public void readCD(){
        // 逗号前是视频显示的数据,逗号后是声音
        this.date ="设计模式,值的好好研究!";
        // 通知主板,自己的状态发生了改变
        this.getMediator().changed(this);
    }
}

CPU

复制代码
package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;


/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description 光驱
 * @Version 1.0
 **/
public class CDDriver extends Colleague {


    public CDDriver(Mediator mediator) {
        super(mediator);
    }

   // 光驱读出来数据
    private String date = "";

    public String getDate() {
        return date;
    }

    public void readCD(){
        // 逗号前是视频显示的数据,逗号后是声音
        this.date ="设计模式,值的好好研究!";
        // 通知主板,自己的状态发生了改变
        this.getMediator().changed(this);
    }
}

声卡

复制代码
package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;


/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description 光驱
 * @Version 1.0
 **/
public class SoundCard extends Colleague {


    public SoundCard(Mediator mediator) {
        super(mediator);
    }

    public void showData(String data){
        System.out.println("画外音: "+data );
    }
}

显卡

复制代码
package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;


/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description 光驱
 * @Version 1.0
 **/
public class ViedoCard extends Colleague {


    public ViedoCard(Mediator mediator) {
        super(mediator);
    }

    public void showData(String data){
        System.out.println("您正在观看的是: "+data );
    }
}

中介者类(主板)最核心的,封装其他对象,负责其他对象之间的交互(统筹兼顾)

复制代码
package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;


/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description
 * @Version 1.0
 **/
public class MainBoard implements Mediator{
    // 需要知道要交互的同事类
    private CPU cpu = null;
    private CDDriver cdDriver = null;
    private SoundCard soundCard = null;
    private ViedoCard viedoCard = null;
    @Override
    public void changed(Colleague colleague) {
        if (colleague == cdDriver){
            // 光驱读取数据
            this.opeCDDriverReadDate((CDDriver)colleague );
        }if (colleague == cpu){
            // 表示CPUU 处理完了
            this.opeCPU((CPU)colleague);
        }
    }

    /**
     * 处理光驱读取数据以后与其他对象的交互
     *
     * @param cd cd
     */
    private void opeCDDriverReadDate(CDDriver cd){
        // 1 先获取光驱读取的数据
        String date = cd.getDate();
        // 2 把这些数据传递给CPU 处理
        this.cpu.executeData(date);
    }

    public void opeCPU(CPU cpu){
        // 1先获取CPU处理后的数据
        String videoDate = cpu.getVideoDate();
        String soudDate = cpu.getSoudDate();
        // 2把这些数据传递给显卡和声卡
        this.viedoCard.showData(videoDate);
        this.soundCard.showData(soudDate);
    }

    public void setCpu(CPU cpu) {
        this.cpu = cpu;
    }

    public void setCdDriver(CDDriver cdDriver) {
        this.cdDriver = cdDriver;
    }

    public void setSoundCard(SoundCard soundCard) {
        this.soundCard = soundCard;
    }

    public void setViedoCard(ViedoCard viedoCard) {
        this.viedoCard = viedoCard;
    }
}

测试

复制代码
package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;

/**
 * @Author Mi_Tao
 * @Date 2023/7/23
 * @Description
 * @Version 1.0
 **/
public class Client {
    public static void main(String[] args) {

        //  1 创建中介者 -- 主板对象
        MainBoard mediator = new MainBoard();
        // 2 创建同事类
        CDDriver cdDriver = new CDDriver(mediator);
        CPU cpu = new CPU(mediator);
        SoundCard soundCard = new SoundCard(mediator);
        ViedoCard viedoCard = new ViedoCard(mediator);

        // 3 让中介者知道所有的同事
        mediator.setCpu(cpu);
        mediator.setCdDriver(cdDriver);
        mediator.setSoundCard(soundCard);
        mediator.setViedoCard(viedoCard);

        // 4 开始看电影 把光盘放入光驱,光驱开始读盘
        cdDriver.readCD();
    }
}

中介者的本质:封装交互(跟外观者模式有点像)

相关推荐
沐土Arvin5 小时前
性能优化关键:link、script和meta的正确打开方式
开发语言·前端·javascript·设计模式·性能优化·html
秋田君10 小时前
深入理解JavaScript设计模式之原型模式
javascript·设计模式·原型模式
~小先生~10 小时前
设计模式——简单工厂模式
设计模式·c#·简单工厂模式
2301_7764085312 小时前
巧用生活实例,快速分清 23 种设计模式,软考中级软件设计师,快速了解与记忆。UML
设计模式·生活·uml
蔡蓝14 小时前
设计模式-策略模式
设计模式·策略模式
暴躁哥17 小时前
深入理解设计模式之适配器模式
设计模式·适配器模式
hstar95271 天前
二十五、面向对象底层逻辑-SpringMVC九大组件之HandlerMapping接口设计
java·spring·微服务·设计模式·架构
智想天开1 天前
20.迭代器模式:思考与解读
java·前端·设计模式·迭代器模式
小鸡脚来咯1 天前
java三种常见设计模式,工厂、策略、责任链
java·开发语言·设计模式
攻心的子乐1 天前
软考 组合设计模式
设计模式