美文网首页Android设计模式
Android设计模式-16-中介者模式

Android设计模式-16-中介者模式

作者: 今阳说 | 来源:发表于2018-06-14 20:49 被阅读49次

1. 定义

  • 又称:调解者/调停者模式
  • 包装了一系列对象相互作用的方式,用来降低这些对象之间的通信复杂性,从中协调充当牵线搭桥的作用

2. 使用场景

  1. 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱,而且难以复用该对象
  2. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类

3. 优缺点

  • 优点:
  1. 使得这些对象不必相互明显作用,从而实现松耦合
  2. 当某些对象之间的作用发生改变时,不会影响其他对象,保证独立变化
  3. 将多对多的相互作用转化为一对多的相互作用,由复杂的网状结构变为以中介者为中心的星型结构
  • 缺点:中介者会庞大,变得复杂难以维护

4. Android源码中的使用

  1. Android的锁屏(Keyguard)是一个非常重要的模块。包含的功能有:解锁(指纹、图案、PIN等)、锁屏通知显示、快速启动相机、快速拨号、显示日期/时间等。其中KeyguardViewMediator是整个待机解/锁屏业务的调度器,负责调度锁屏界面的相关动作及查询解锁屏状态,其中包含了许多XXXManager的管理器成员变量,如AlarmManager,StatusBarManager,PowerManager等,KeyguardViewMediator则是充当中介者协调这些管理器的状态改变
  2. Binder机制中ServiceManager和Binder Driver充当中介者,协调服务端与客户端

5. 实例演示

以电脑播放CD为例,主板作为中介者,协调cpu,内存,显卡,声卡,光驱等模块,这些模块间等通信都是通过主板进行等,对其中任何一个进行更改(如升级换新)都不会影响到其他模块,只需要调整其与主板间到连接即可,主板再通知其他模块作出相应调整

  1. 首先创建一个中介者基类
    //抽象的中介者
    abstract class Mediator {
        //各模块改变时通知中介者的方法,由中介者通知其他模块
        public abstract void changed(Colleague c);
    }
  1. 创建主板类
     //中介者实现类:主板
    class MainBoard extends Mediator {
        private CDDevice mCDDevice;//光驱
        private CPU mCPU;//cpu
        private SoundCard mSoundCard;//声卡
        private GraphicsCard mGraphicsCard;//显卡

        @Override
        public void changed(Colleague c) {
            if (c == mCDDevice) {
                //光驱读取完数据
                handleCD((CDDevice) c);
            } else if (c == mCPU) {
                //cpu解析完数据
                handleCPU((CPU) c);
            }

        }

        //处理cpu读取数据后与其他设备的交互
        private void handleCPU(CPU cpu) {
            mSoundCard.soundPlay(cpu.getDataSound());
            mGraphicsCard.videoPlay(cpu.getDataVideo());
        }

        //处理光驱读取数据后与其他设备的交互
        private void handleCD(CDDevice cdDevice) {
            mCPU.decodeData(cdDevice.read());
        }

        public void setCDDevice(CDDevice CDDevice) {
            mCDDevice = CDDevice;
        }

        public void setCPU(CPU CPU) {
            mCPU = CPU;
        }

        public void setSoundCard(SoundCard soundCard) {
            mSoundCard = soundCard;
        }

        public void setGraphicsCard(GraphicsCard graphicsCard) {
            mGraphicsCard = graphicsCard;
        }
    }
  1. 创建一个模块基类,相当于实际中各模块与主板连接的硬件接口协议或软件驱动协议,这些都是有统一标准的
    //抽象同事类
    abstract class Colleague {
        protected Mediator mMediator;//每个同事都该知道其中介者

        public Colleague(Mediator mediator) {
            mMediator = mediator;
        }
    }
  1. 各模块的实现类,CPU,光驱,声卡,显卡等, 从代码中可以看到,各模块只负责自己职责范围的工作,将处理结果通知给主板,由主板来协调下一步需要做什么,模块间实现解耦
   //CPU:  负责从主板传递来的音视频数据的解码
    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];
            //告诉中介者自身状态改变
            mMediator.changed(this);
        }
    }

    //光驱:  负责读取光盘的数据,并提供给主板
    class CDDevice extends Colleague {
        public String data;//视频数据

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

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

        //加载视频数据
        public void load() {
            data = "视频数据,音频数据";
            //通知中介者
            mMediator.changed(this);
        }
    }

    //显卡, 声卡:  负责播放视频和音频
    class GraphicsCard extends Colleague {

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

        //播放视频
        public void videoPlay(String data) {
            LjyLogUtil.i("videoPlay:" + data);
        }
    }

    class SoundCard extends Colleague {

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

        public void soundPlay(String data) {
            LjyLogUtil.i("soundPlay:" + data);
        }
    }
  1. 创建实例,完成播放CD的流程
 private void methodMediatorPattern() {
        //1.构造主板对象
        MainBoard mainBoard = new MainBoard();
        //2.构造各个模块设备
        CDDevice cdDevice = new CDDevice(mainBoard);
        CPU cpu = new CPU(mainBoard);
        GraphicsCard graphicsCard = new GraphicsCard(mainBoard);
        SoundCard soundCard = new SoundCard(mainBoard);
        //3.将各个模块安装到主板
        mainBoard.setCDDevice(cdDevice);
        mainBoard.setCPU(cpu);
        mainBoard.setGraphicsCard(graphicsCard);
        mainBoard.setSoundCard(soundCard);
        //4.执行cd播放:
        cdDevice.load();
    }

上面执行cd播放的具体流程如下:
光驱调用load()方法读取cd,读取完成后通知主板-->主板收到通知后,将光驱读取到的数据传给cpu去解码-->cpu解析数据,解析完成后通知主板-->主板收到通知后,将cpu解码出的音视频流传给声卡, 显卡播放-->声卡显卡播放音视频, 至此就完成来cd的播放

相关文章

网友评论

    本文标题:Android设计模式-16-中介者模式

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