Mediator_中介者模式_PHP语言描述

Stella981
• 阅读 305

中介者模式,我的理解是,你的项目中存在许多级别平等的同事类实例,并且这些实例之间都需要有不同程度的各种交互操作活动。这个时候可以使用中介者模式来降低各同事类的耦合程度,每个同事类都只关心自己需要做什么,把耦合交互的工作交给中介类来完成。这里用了一个模拟电脑播放CD的例子来讲述这个问题。

这是一个标准定义中得中介者模式用例,在实际应用着,可能不需要所有的同事类都继承于一个父类,也不一定中介者类必须持有所有的同事用类。更多的时候中介者实例可能会用Singleton单例模式来设计。

<?php
 //抽象的同事类
 abstract class Colleague{
  private $mediator;
  
  public function __construct($mediator){
   if($mediator instanceof Mediator)
   {
    $this->mediator = $mediator;
   }
   else {
    trigger_error("Input Object isn't Mediator Class Object!",E_USER_ERROR);
   }
  }
  
  public function getMediator(){
   return $this->mediator;
  }
 }
 
 //CD驱动器类
 class CDDriver extends Colleague{
  public function __construct($mediator){
   parent::__construct($mediator);
  }
  
  //数据变量
  private $data;
  
  //获取光驱读取出来的数据
  public function getData(){
   return $this->data;
  }
  
  //读取光盘
  public function readCD(){
   $this->data = "设计模式,值得好好研究";
   //通知主板,自己的状态发生了改变
   $this->getMediator()->changed($this);
  }
  
 }
 
 //CPU类
 class CPU extends Colleague{
  public function __construct($mediator){
   parent::__construct($mediator);
  }
  //视频数据
  private $videoData;
  //声音数据
  private $soundData;
  
  public function getVideoData(){
   return $this->videoData;
  }
  
  public function getSoundData(){
   return $this->soundData;
  }
  
  public function executeData($data){
   $dataArr = explode(",", $data);
   $this->videoData = $dataArr[0];
   $this->soundData = $dataArr[1];
   $this->getMediator()->changed($this);
  }
 }
 
 //显卡类
 class VideoCard extends Colleague{
  public function __construct($mediator){
   parent::__construct($mediator);
  }
  public function showData($data){
   echo '您现在观看的是:'.$data;
  }
 }
 
 //声卡类
 class SoundCard extends Colleague{
  public function __construct($mediator){
   parent::__construct($mediator);
  }
  public function showData($data){
   echo '画外音:'.$data;
  }
 }
 
 //定义中介者模式接口
 interface Mediator{
  public function changed($colleague);
 }
 
 class MotherBoard implements Mediator{
  //定于中介对象需要掌握的所有需要交互的同事类
  private $cdDriver,$cpu,$videoCard,$soundCard;
  
  public function setCdDriver($cdDriver){
   $this->cdDriver = $cdDriver;
  }
  
  public function setCPU($cpu){
   $this->cpu = $cpu;
  }
  
  public function setVideoCard($videoCard){
   $this->videoCard = $videoCard;
  }
  
  public function setSoundCard($soundCard){
   $this->soundCard = $soundCard;
  }
  
  public function changed($colleague){
   if($colleague instanceof CDDriver){
    $this->opeCDDriverReadData($colleague);
   }
   else if($colleague instanceof CPU){
    $this->opeCPU($colleague);
   }
  }
  
  private function opeCDDriverReadData($cd){
   $data = $cd->getData();
   $this->cpu->executeData($data);
  }
  
  private function opeCPU($cpu){
   $videoData = $cpu->getVideoData();
   $soundData = $cpu->getSoundData();
   $this->videoCard->showData($videoData);
   echo '<br>';
   $this->soundCard->showData($soundData);
  }
 }
 
 //创建中介对象:主板
 $mediator = new MotherBoard();
 //创建各同事类:CD驱动,CPU,显卡,声卡
 $cd = new CDDriver($mediator);
 $cpu = new CPU($mediator);
 $videoCard = new VideoCard($mediator);
 $soundCard = new SoundCard($mediator);
 //让中介类知道所有需要交互的同事类
 $mediator->setCdDriver($cd);
 $mediator->setCPU($cpu);
 $mediator->setSoundCard($soundCard);
 $mediator->setVideoCard($videoCard);
 
 $cd->readCD();
?>
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
Stella981 Stella981
2年前
MediatorPattern中介者模式
中介者模式1.定义使用一个中介对象封装一系列的对象交互,中介者使用对象不需要显式的相互作用,从而实降现低耦合度,且可以独立改变被封装的一些列对象之间的交互。中介者模式也叫做调停者模式:对象之间的依赖就像战争,很混乱,加入一个中心,所有对象都和中心交流,接受中心的调停处理。中介者模式通常有4个角色Abstrac
Wesley13 Wesley13
2年前
Java设计模式
模式描述工厂方法模式提供一个用于创建产品的接口,由实现类决定实现哪些产品。工厂方法模式使一个类的实例化延迟到子类,并且只适用于一个产品的等级结构。优点可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。例子还是以之前简单工厂的手机为案例:/
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
7个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这