设计模式–中介者模式(Mediator)

来源:互联网 发布:淘宝精选怎么进去 编辑:程序博客网 时间:2024/06/08 16:31

设计模式–中介者模式(Mediator)

定义:

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

类型:

行为类模式。

类图:

这里写图片描述

中介者模式的结构:

中介者模式又称为调停者模式,从类图中看共分为3个部分
-抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现
-中介者实现类:从抽象者中介者接口中实现而来,实现抽象方法,从一个同事类接受消息,然后通过消息影响其他类。
-同事类:如果一个对象影响会影响其他对象,同时也会被其他的对象影响,那么这两个对象称为同事类。(下面有具体类图上面只是一个抽象)。在实际应用中 同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。在中介者模式中,同事类之间必须通过中介者才能进行消息传递

为什么要使用中介者结构

一般来说,同事类之间的关系是比较复杂的,多个同事类之间相互关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,既不利于类的复用,也不稳定
如下图有6个同事类对象当1改变时有4个要收到影响当2改变时有5个要受到影响
这里写图片描述

如果引入中介者模式 ,同事类之间的关系将会变成星型结构,从图可以看出, 当任何一个同事类发生改变,影响的只有自己本身和中介者类,这样就减少了系统的耦合 ,一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理不属于自己的行为。
这里写图片描述

概念扯了一大堆 废话不说了 来个具体事例-打开电脑看电影

比如有如下的交互:

1.首先光驱读取光盘上的数据,然后告诉主板,它的状态已经改变了。

2.主板得到光驱的数据,将数据交给CPU进行分析处理。

3.CPU处理完,将数据分成了视频数据和音频数据,通知主板,已将处理好了。

4.主板得到数据,将数据交给显卡和声卡进行输出。

来个类图看看

——————-这里写图片描述
具体代码

import mediator2.colleague.Colleague;/*中介者接口*/public interface Mediator {    void change(Colleague colleague);}/*中介者实现类*/public class ConcreteMediator implements Mediator{    private CDDriver cdDriver;    private Cpu cpu;    private VideoCard video;    private SoundCard sound;    public void setCdDriver(CDDriver cdDriver) {        this.cdDriver = cdDriver;    }    public void setCpu(Cpu cpu) {        this.cpu = cpu;    }    public void setVideo(VideoCard video) {        this.video = video;    }    public void setSound(SoundCard sound) {        this.sound = sound;    }    @Override    public void change(Colleague colleague) {        if(colleague==cdDriver){            getData((CDDriver)colleague);        }        if(colleague==cpu){            sendData((Cpu)colleague);        }    }    private void getData(CDDriver cdDriver){        this.cpu.executeData(cdDriver.getData());    }    private void sendData(Cpu cpu){        this.video.show(cpu.getVideoData());        this.sound.show(cpu.getSoundData());    }}/*同事类抽象类*/public abstract class Colleague {/*每个同事类都要知道中介者*/private Mediator mediator;public Colleague(Mediator mediator) {    this.mediator = mediator;}/*获取当前同事的中介者类*/public Mediator getMediator() {    return mediator;}}/*光驱读取数据*/public class CDDriver extends Colleague{private String data;public CDDriver(Mediator mediator,String data) {    super(mediator);    this.data=data;}/*读数据 读完通知中介者*/public void setData(String data) {    this.data = data;    this.getMediator().change(this);}public String getData() {    return data;}}/*cpu*/public class Cpu extends Colleague{/*分解出来的图形数据*/private String videoData;/*分解出的声音数据*/private String soundData;    public Cpu(Mediator mediator) {        super(mediator);    }    public String getVideoData() {        return videoData;    }    public String getSoundData() {        return soundData;    } /*处理数据*/    public void executeData(String data){        String [] ss=data.split(",");        this.videoData=ss[0];        this.soundData=ss[1];        //通知中介者        this.getMediator().change(this);    }}/*声卡*/public class SoundCard extends Colleague{    public SoundCard(Mediator mediator) {        super(mediator);    }   public void show(String data){       System.out.println("你正在听:"+data);   }}/*显卡*/public class VideoCard extends Colleague{    public VideoCard(Mediator mediator) {        super(mediator);    }    public void show(String data){        System.out.println("你正在看:"+data);    }}测试:public static void main(String[] args) {    ConcreteMediator mediator = new ConcreteMediator();    CDDriver cdDriver=new CDDriver(mediator, "video,sound");    Cpu cpu =new Cpu(mediator);    SoundCard sound =new SoundCard(mediator);    VideoCard video = new VideoCard(mediator);    mediator.setCdDriver(cdDriver);    mediator.setCpu(cpu);    mediator.setSound(sound);    mediator.setVideo(video);    mediator.change(cdDriver);}你正在看:video你正在听:sound

每天扯蛋一点点。。。

0 0