设计模式之中介者模式

中介者模式

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

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

经典中介者模式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();
    }
}

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

相关推荐
程序员Terry17 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
刀法如飞1 天前
AI时代,程序员都应该是算法思想工程师
人工智能·设计模式·程序员
在西安放羊的牛油果2 天前
我把 2000 行下单代码,重构成了一套交易前端架构
前端·设计模式·架构
寅时码3 天前
React 正在演变为一场不可逆的赛博瘟疫:AI 投毒、编译器迷信与装死的官方
前端·react.js·设计模式
willow6 天前
Axios由浅入深
设计模式·axios
七月丶8 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞8 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼8 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟8 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式