设计模式之中介者模式

概念:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,what happen balabala,把多对多的相互作用转化成一对多的相互作用。
场景:租房子,租客和房东不需要相互作用,一切交给中介。
示例:
这里写图片描述

1、抽象中介者,Mediator

/**
 * 抽象中介
 * @author jin.li
 *
 */
public abstract class Mediator {

    public abstract void changed(Colleague colleague);

}

2、具体的中介者,主板

/**
 * 主板中介
 * @author jin.li
 *
 */
public class MainBoard extends Mediator {
    private CDDveice mCDDveice;
    private CPU mCPU;
    private SoundCard mSoundCard;
    private GraphicsCard mGraphicsCard;

    @Override
    public void changed(Colleague colleague) {
        if (colleague == mCDDveice) {
            handleCD((CDDveice) colleague);
        }
        if (colleague == mCPU) {
            handleCPU((CPU) colleague);
        }
    }

    /**
     * 处理光驱读取数据后与其他设备的交互
     * @param cdDveice
     */
    public void handleCD(CDDveice cdDveice) {
        mCPU.decodeData(cdDveice.readData());
    }

    /**
     * 处理CPU读取数据后和其他设备的交互
     * @param cpu
     */
    public void handleCPU(CPU cpu) {
        mSoundCard.playSound(cpu.getDateSound());
        mGraphicsCard.playVideo(cpu.getDateVideo());
    }

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

    public void setCDDevice(CDDveice cdDveice) {
        this.mCDDveice = cdDveice;
    }

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

    public void setGraphicsCard(GraphicsCard graphicsCard) {
        this.mGraphicsCard = graphicsCard;
    }
}

3、抽象同事类

/**
 * 抽象同事类
 * @author jin.li
 *
 */
public abstract class Colleague {
    //每一个同事都应该知道中介
    public Mediator mediator;

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

}

4、具体的同事,cpu,cd,sound,video。


/**
 * CPU同事
 * @author jin.li
 *
 */
public class CPU extends Colleague{
    private String mDataVideo;//视频数据
    private String mDateSound;//音频数据

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

    /**
     * 获取视频数据
     * @return
     */
    public String getDateVideo() {
        return mDataVideo;
    }

    /**
     * 获取音频数据
     * @return
     */
    public String getDateSound() {
        return mDateSound;
    }

    public void decodeData(String data) {
        //省略解析数据的逻辑
        mDataVideo = "这是视频";
        mDateSound = "这是音频";

        //通知中介,自身状态发生改变了
        mediator.changed(this);
    }

}

/**
 * CPU同事
 * @author jin.li
 *
 */
public class CPU extends Colleague{
    private String mDataVideo;//视频数据
    private String mDateSound;//音频数据

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

    /**
     * 获取视频数据
     * @return
     */
    public String getDateVideo() {
        return mDataVideo;
    }

    /**
     * 获取音频数据
     * @return
     */
    public String getDateSound() {
        return mDateSound;
    }

    public void decodeData(String data) {
        //省略解析数据的逻辑
        mDataVideo = "这是视频";
        mDateSound = "这是音频";

        //通知中介,自身状态发生改变了
        mediator.changed(this);
    }

}
/**
 * 显卡同事
 * @author jin.li
 *
 */
public class GraphicsCard extends Colleague {

    public GraphicsCard(Mediator mediator) {
        super(mediator);

    }

    public void playVideo(String data) {
        System.out.println(data);
    }
}
/**
 * 声卡同事
 * @author jin.li
 *
 */
public class SoundCard extends Colleague {

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

    public void playSound(String data) {
        System.out.println(data);
    }

}

5、客户端

public class Client {
    public static void main(String[] args) {
        //构造主板对象
        MainBoard mainBoard = new MainBoard();

        //分别构造各个零部件
        CDDveice cdDveice = new CDDveice(mainBoard);
        CPU cpu = new CPU(mainBoard);
        GraphicsCard graphicsCard = new GraphicsCard(mainBoard);
        SoundCard soundCard = new SoundCard(mainBoard);

        //将各个零部件安装到主板
        mainBoard.setCDDevice(cdDveice);
        mainBoard.setCPU(cpu);
        mainBoard.setSoundCard(soundCard);
        mainBoard.setGraphicsCard(graphicsCard);

        //开始播放
        cdDveice.loadData();
    }
}

总结:中介者模式就是用来协调多个对象之间的交互的,就像主板,没有主板这个中介者,那么cpu,cd,sound,video就需要相互建立关联,那太复杂了。

衍生:Andorid源码中的KeyguardViewMediator就是一个中介者,它里面有着各种管理者。

学习笔记:《Android源码设计模式解析与实战》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值