美文网首页
23种设计模式-中介者模式(主板-CPU、CD...)

23种设计模式-中介者模式(主板-CPU、CD...)

作者: 王灵 | 来源:发表于2019-03-01 12:07 被阅读0次

定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散偶合;中介者模式将多对多的相互作用转化为一对多的相互作用。
使用场景:当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为了防止修改一个对象时,同时涉及修改其他对象的行为,可以采用中介者模式;

以电脑的主板、CPU、CD、声卡、显卡为例

/**
 * 抽象中介者
 */
public abstract class MeDiator {
    public abstract void changed(Colleague c);
}

/**
 * 抽象同事
 */
public abstract class Colleague {
    protected MeDiator meDiator;

    public Colleague(MeDiator meDiator) {
        this.meDiator = meDiator;
    }
}

/**
 * CPU同事
 */
public class CPU extends Colleague {
    private String dataVideo,dataSound;//音频和视频数据
    public CPU(MeDiator meDiator) {
        super(meDiator);
    }
    public void decodeData(String data){
        //分割音、视频数据
        String[] tmp=data.split(",");
        dataVideo=tmp[0];
        dataSound=tmp[1];
        //告诉中介者自身的状态
        meDiator.changed(this);
    }

    public String getDataVideo() {
        return dataVideo;
    }

    public String getDataSound() {
        return dataSound;
    }
}

/**
 * 光驱同事
 */
public class CDDevice extends Colleague {
    private String data;//视频数据

    public CDDevice(MeDiator meDiator) {
        super(meDiator);
    }

    /**
     * 读取视频数据
     *
     * @return
     */
    public String read() {
        return data;
    }

    /**
     * 加载视频数据
     */
    public void load() {
     //实际情况中视频数据和音频数据都是一个数据流
        data="视频数据,音频数据";

        //通知中介者,数据改变
        meDiator.changed(this);
    }
}

/**
 * 显卡同事
 */
public class GraphicsCard extends Colleague {
    public GraphicsCard(MeDiator meDiator) {
        super(meDiator);
    }

    /**
     * 播放视频
     *
     * @param data
     */
    public void videoPlay(String data) {
        Log.e("视频:" + data);
    }
}

/**
 * 声卡同事
 */
public class SoundCard extends Colleague {
    public SoundCard(MeDiator meDiator) {
        super(meDiator);
    }

    /**
     * 播放音频
     *
     * @param data
     */
    public void soundPlay(String data) {
        Log.e("音频:" + data);
    }
}

/**
 * 主板中介者
 */
public class MainBoard extends MeDiator {
    private CDDevice cdDevice;
    private CPU cpu;
    private SoundCard soundCard;
    private GraphicsCard graphicsCard;

    @Override
    public void changed(Colleague c) {
//如果光驱读取了数据
        if (c == cdDevice) {
            handleCD((CDDevice) c);
        } else if (c == cpu) {
            handleCPU((CPU) c);
        }

    }

    /**
     * 处理光驱读取数据之后与其它设备的交互
     *
     * @param cdDevice
     */
    private void handleCD(CDDevice cdDevice) {
        cpu.decodeData(cdDevice.read());
    }

    /**
     * 处理CPU读取数据之后与其它设别的交互
     *
     * @param cpu
     */
    private void handleCPU(CPU cpu) {
        soundCard.soundPlay(cpu.getDataSound());
        graphicsCard.videoPlay(cpu.getDataVideo());
    }

    public void setCdDevice(CDDevice cdDevice) {
        this.cdDevice = cdDevice;
    }

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

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

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

/**
 * 客户类
 */
public class Client {
    public static void main(String[] args) {
        //创建主板
        MainBoard mainBoard = new MainBoard();
        //构建各个零件
        CPU cpu = new CPU(mainBoard);
        CDDevice cdDevice = new CDDevice(mainBoard);
        GraphicsCard graphicsCard = new GraphicsCard(mainBoard);
        SoundCard soundCard = new SoundCard(mainBoard);

        //安装零件
        mainBoard.setCpu(cpu);
        mainBoard.setCdDevice(cdDevice);
        mainBoard.setGraphicsCard(graphicsCard);
        mainBoard.setSoundCard(soundCard);

        //完成后就可以开始放片片了
        cdDevice.load();
    }
}

相关文章

网友评论

      本文标题:23种设计模式-中介者模式(主板-CPU、CD...)

      本文链接:https://www.haomeiwen.com/subject/ctzruqtx.html