• 设计模式——调停者模式


      调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

    角色

      抽象调停者(Mediator)角色:定义出同事对象到调停者对象的接口,其中主要方法是一个(或多个)事件方法。
      具体调停者(ConcreteMediator)角色:实现了抽象调停者所声明的事件方法。具体调停者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系。
      抽象同事类(Colleague)角色:定义出调停者到同事对象的接口。同事对象只知道调停者而不知道其余的同事对象。
      具体同事类(ConcreteColleague)角色:所有的具体同事类均从抽象同事类继承而来。实现自己的业务,在需要与其他同事通信的时候,就与持有的调停者通信,调停者会负责与其他的同事交互。

    优点

      1、松散耦合:调停者模式通过把多个同事对象之间的交互封装到调停者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一处而动全身”了。
      2、集中控制交互:多个同事对象的交互,被封装在调停者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改调停者对象就可以了,当然如果是已经做好的系统,那么就扩展调停者对象,而各个同事类不需要做修改。
      3、多对多变成一对多:没有使用调停者模式的时候,同事对象之间的关系通常是多对多的,引入调停者对象以后,调停者对象和同事对象的关系通常变成双向的一对多,这会让对象的关系更容易理解和实现。

    缺点

      调停者模式的一个潜在缺点是,过度集中化。如果同事对象的交互非常多,而且比较复杂,当这些复杂性全部集中到调停者的时候,会导致调停者对象变得十分复杂,而且难于管理和维护。

    实现

      参考网上的示例,电脑播放电影的例子,进行调停者模式的实现。类图如下:

    IMediator定义:

    package com.lidaming.design21.mediator;
    
    public interface IMediator {
        void changed(Colleage c);
    }
    View Code

    Colleage定义:

    package com.lidaming.design21.mediator;
    
    public abstract class Colleage {
        private IMediator mediator;
    
        public Colleage(IMediator m) {
            mediator = m;
        }
    
        public IMediator getMediator() {
            return mediator;
        }
    }
    View Code

    CDDriver实现:

    package com.lidaming.design21.mediator;
    
    public class CDDriver extends Colleage {
        private String data;
    
        public CDDriver(IMediator m) {
            super(m);
        }
    
        public void readCD() {
            data = "voice,vedio";
            getMediator().changed(this);
        }
        
        public String getData()
        {
            return data;
        }
    
    }
    View Code

    CPU的实现:

    package com.lidaming.design21.mediator;
    
    public class CPU extends Colleage {
        private String vedioData;
        private String soundData;
    
        public CPU(IMediator m) {
            super(m);
        }
    
        public String getVedioData() {
            return vedioData;
        }
    
        public String getSoundData() {
            return soundData;
        }
    
        public void processData(String data) {
            String[] arr = data.split(",");
            soundData = arr[0];
            vedioData = arr[1];
    
            getMediator().changed(this);
        }
    
    }
    View Code

    SoundCard的实现:

    package com.lidaming.design21.mediator;
    
    public class SoundCard extends Colleage {
    
        public SoundCard(IMediator m) {
            super(m);
        }
        
        public void soundData(String data)
        {
            System.out.println("sound data:"+data);
        }
    
    }
    View Code

    VedioCard的实现:

    package com.lidaming.design21.mediator;
    
    public class VedioCard extends Colleage {
    
        public VedioCard(IMediator m) {
            super(m);
        }
        
        public void showData(String data)
        {
            System.out.println("show data:"+data);
        }
    
    }
    View Code

    MainBoard的实现:

    package com.lidaming.design21.mediator;
    
    public class MainBoard implements IMediator {
    
        private CDDriver cd;
        private CPU cpu;
        private SoundCard sound;
        private VedioCard vedio;
        
        public void changed(Colleage c) {
            if(c.getClass().getSimpleName().equals(CDDriver.class.getSimpleName()))
            {
                CDDriver cdd=(CDDriver)c;
                cpu.processData(cdd.getData());
            }
            else if(c.getClass().getSimpleName().equals(CPU.class.getSimpleName()))
            {
                CPU cp=(CPU)c;
                String soundData = cp.getSoundData();
                String vedioData = cp.getVedioData();
                
                sound.soundData(soundData);
                vedio.showData(vedioData);
            }
        }
    
        public CDDriver getCd() {
            return cd;
        }
    
        public void setCd(CDDriver cd) {
            this.cd = cd;
        }
    
        public CPU getCpu() {
            return cpu;
        }
    
        public void setCpu(CPU cpu) {
            this.cpu = cpu;
        }
    
        public SoundCard getSound() {
            return sound;
        }
    
        public void setSound(SoundCard sound) {
            this.sound = sound;
        }
    
        public VedioCard getVedio() {
            return vedio;
        }
    
        public void setVedio(VedioCard vedio) {
            this.vedio = vedio;
        }
    
    }
    View Code

    场景类的实现:

    package com.lidaming.design21.mediator;
    
    public class Client {
        public static void main(String[] args) {
            MainBoard mainBoard = new MainBoard();
    
            CDDriver cdDriver = new CDDriver(mainBoard);
            CPU cpu = new CPU(mainBoard);
            SoundCard soundCard = new SoundCard(mainBoard);
            VedioCard vedioCard = new VedioCard(mainBoard);
            
            mainBoard.setCd(cdDriver);
            mainBoard.setCpu(cpu);
            mainBoard.setSound(soundCard);
            mainBoard.setVedio(vedioCard);
            
            cdDriver.readCD();
            
            
        }
    }
    View Code

    参考

    http://www.cnblogs.com/java-my-life/archive/2012/06/20/2554024.html
    http://blog.csdn.net/undoner/article/details/8898675

  • 相关阅读:
    PAIRING WORKFLOW MANAGER 1.0 WITH SHAREPOINT 2013
    Education resources from Microsoft
    upgrade to sql server 2012
    ULSViewer sharepoint 2013 log viewer
    Top 10 Most Valuable Microsoft SharePoint 2010 Books
    讨论 Setsockopt选项
    使用 Alchemy 技术编译 C 语言程序为 Flex 可调用的 SWC
    Nagle's algorithm
    Nagle算法 TCP_NODELAY和TCP_CORK
    Design issues Sending small data segments over TCP with Winsock
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5465153.html
Copyright © 2020-2023  润新知