中介者模式

中介者模式

##定义 中介者模式包装了一系列对象相互调用的方式,使得这些对象没必要明显相互做用。从而使它们能够松散耦合。当某些对象之间的耦合发生改变时,不会当即影响其余的一些对象之间的做用。保证这些对象能够彼此独立变化。 中介者模式将多对多的相互做用转化为一对多的相互做用。 中介者模式将对象的行为和协做抽象化,把对象在小尺度上与其余对象的相互做用分开处理。 ##使用场景 当对象之间的交互操做不少且每一个对象的行为操做都相互彼此依赖时,为防止在修改一个对象的行为时,同时涉及修改不少其余对象的行为,能够采用中介者模式来解决紧凑耦合问题。bash

Android中中介者模式最多见的场景莫过于view之间的联动了。ide

##模式结构ui

  • Mediator 抽象中介者角色 定义了同事对象到中介者对象的接口,通常以抽象的方式实现
  • ConcreteMediator 具体中介者角色 继承于抽象中介者,实现了父类定义的方法,它具体的同事对象接收消息,向具体的同事对象发出命令
  • Colleague 抽象同事类角色 定义了中介者对象的接口,它只知道中介者而不知道其余的同事对象
  • ConcreteColleagueA/B 具体同事类角色 继承于抽象同事类,每一个具体同事类都知道自己在小范围内的行为,而不知道它在大范围内的目的

##简单实现this

public abstract class Mediator {

    public abstract void change(Colleague c);
}

复制代码

抽象中介者Mediatorspa

public abstract class Colleague {
    protected Mediator mediator;

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

复制代码

抽象同事Colleaguecode

public class MainBoard extends Mediator {

    private CDDevice cdDevice;
    private CPU cpu;
    private SoundCard soundCard;
    private GraphicsCard graphicsCard;

    @Override
    public void change(Colleague c) {
        if (c == cdDevice) {
            handleCD((CDDevice) c);
        } else if (c == cpu) {
            handleCPU((CPU) c);
        }
    }

    private void handleCD(CDDevice cdDevice) {
        cpu.decodeData(cdDevice.read());
    }

    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;
    }
}

复制代码

主板中介者MainBoard,充当具体中介者角色,负责计算机各个组件的协调调度视频

public class CDDevice extends Colleague {

    private String data;

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

    public String read() {
        return data;
    }

    public void load() {
        data = "视频,音频数据流";
        mediator.change(this);
    }
}
复制代码

CD设备,模拟音视频源文件的写入对象

public class CPU extends Colleague {

    private String dataVideo, dataSound;

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

    public String getDataVideo() {
        return dataVideo;
    }

    public String getDataSound() {
        return dataSound;
    }

    public void decodeData(String data) {
        String[] tmp = data.split(",");

        dataVideo = tmp[0];

        dataSound = tmp[1];

        mediator.change(this);
    }
}

复制代码

CPU类,解释计算机指令以及处理计算机软件中的数据,这里模拟获得音视频流数据继承

public class GraphicsCard extends Colleague {
    public GraphicsCard(Mediator mediator) {
        super(mediator);
    }

    public void videoPlay(String data) {
        System.out.println("视频:" + data);
    }
}

复制代码

显卡类SoundCard,模拟显示图像信息接口

public class SoundCard extends Colleague {
    public SoundCard(Mediator mediator) {
        super(mediator);
    }

    public void soundPlay(String data){
        System.out.println("音频:" + data);
    }
}

复制代码

声卡类SoundCard,模拟播放音频信息

public class Client {

    public static void main(String[] args) {

        //构造主板
        MainBoard mainBoard = new MainBoard();

        // 构造零件
        CDDevice cd = new CDDevice(mainBoard);
        CPU cpu = new CPU(mainBoard);
        GraphicsCard gc = new GraphicsCard(mainBoard);
        SoundCard sc = new SoundCard(mainBoard);

        //零件安装到主板
        mainBoard.setCdDevice(cd);
        mainBoard.setCpu(cpu);
        mainBoard.setGraphicsCard(gc);
        mainBoard.setSoundCard(sc);

        //播放
        cd.load();
    }
}

复制代码

客户类调用结果:

音频:音频数据流
视频:视频

Process finished with exit code 0
复制代码
相关文章
相关标签/搜索