中介者模式

1类图

这里写图片描述

2定义

中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者将对象的行为和协作抽象化,把对象的小尺度的行为上与其他对象的相互作用分开处理。

3应用场景

当对象之间的交互操作多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可采取中介者模式,来解决紧偶合问题。该模式将对象之间的多对多关系变为一对多关系,中介者对象将系统从网状结构变为调停者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用。

通用模式

4抽象中介者

public abstract class Mediator {
    protected ConcreteColleagueA colleagueA;
    protected ConcreteColleagueB colleagueB;

    public abstract void method();

    public void setColleagueA(ConcreteColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public void setColleagueB(ConcreteColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }

}

5具体中介者

public class ConcreteMediator extends Mediator {

    @Override
    public void method() {
        colleagueA.action();
        colleagueB.action();
    }

}

6抽象同事

public abstract class Colleague {

    protected Mediator mediator;

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

    public abstract void action();

}

7具体同事A

public class ConcreteColleagueA extends Colleague {

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

    @Override
    public void action() {
        System.out.println("ConcreteColleagueA 将信息交递给中介者处理");
    }

}

8具体同事B

public class ConcreteColleagueB extends Colleague {

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

    @Override
    public void action() {
        System.out.println("ConcreteColleagueB 将信息交递给中介者处理");
    }

}

简单实现

9抽象中介者

public abstract class Mediator {
    public abstract void changed(Colleague c);
}

10抽象同事

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

11CPU同事

public class CPU extends Colleague {

    private String dataVideo,dataSound;

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

    public String getDataSound() {
        return dataSound;
    }

    public String getDataVideo() {
        return dataVideo;
    }

    public void decodeData(String data){
        String[] split = data.split(",");
        dataSound = split[1];
        dataVideo = split[0];
        mediator.changed(this);
    }
}

12光驱同事

public class CDDevice extends Colleague {

    private String data;

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

    public String read(){
        return data;
    }

    public void load(){
        data = "视频数据,音频数据";
        mediator.changed(this);
    }



}

13显卡同事

public class GraphicsCard extends Colleague {

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

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

}

14声卡同事

public class SoundCard extends Colleague {

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

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

}

15主板中介者

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

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

}

16客户类

public class Client {

    public static void main(String[] args) {
        MainBoard mediator = new MainBoard();
        CDDevice cdDevice = new CDDevice(mediator);
        CPU cpu = new CPU(mediator);
        GraphicsCard graphicsCard = new GraphicsCard(mediator);
        SoundCard soundCard = new SoundCard(mediator);

        mediator.setcDDevice(cdDevice);
        mediator.setCpu(cpu);
        mediator.setGraphicsCard(graphicsCard);
        mediator.setSoundCard(soundCard);
        cdDevice.load();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值