zoukankan      html  css  js  c++  java
  • php设计模式之:中介者模式

    <?php
    
    abstract class Component
    {
        protected $mediator;
    
    	public function setMediator(Mediator $mediator){
    		$this->mediator = $mediator;
    	}
    	
    	public function getMediator(){
    		return $this->mediator;
    	}
    	
    	public function changed(){
    		$this->mediator->componentChanged($this);
    	}
    	
    	public abstract function update();
    }
    
    class Button extends Component
    {
    	private $id;
    	
    	public function getId(){
    		return $this->id;
    	}
    	
    	public function setId(int $id){
    		$this->id = $id;
    	}
    	
    	public function update(){
    		echo '我被点击了';//这里只执行当前对象自身的事件
    		$this->changed();//交给中介者,让其执行其他对象的关联事件,例如:当前是添加学生按钮,添加以后,需要把刚刚添加的学生信息显示在表格的最上面一行
    	}
    }
    
    class Table extends Component
    {
    	public function update($str = ''){
    		echo "<tr>{$str}</tr>";
    	}
    }
    
    class Mediator
    {
    	private $table;
    	
    	public function getTable(){
    		return $this->table;
    	}
    	
    	public function setTable(Table $table){
    		$this->table = $table;
    	}
    	
    	public function componentChanged(Component $component){
    		if($component instanceof Button && 123 == $component->getId()){//假设id为1的按钮标识添加学生按钮
    			$this->table->update('张三:男,年龄:18');
    		}
    	}
    }
    
    $addBtn = new Button();
    $addBtn->setId(123);
    $table = new Table();
    $mediator = new Mediator();
    $mediator->setTable($table);
    $addBtn->setMediator($mediator);
    $addBtn->update();
    

    程序运行结果显示:

    我被点击了<tr>张三:男,年龄:18</tr>
    

    如上代码所示,Btton对象不用直接关心Table对象,而是只用关心中介者Mediator,让中介者帮助Btton对象去通知其他(这里是Table)对象,达到Button对象和Table对象的解耦合。
    优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

    缺点:中介者会庞大,变得复杂难以维护。

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

    注意事项:不应当在职责混乱的时候使用。

  • 相关阅读:
    mysql常用基本命令
    mysql8.0.13下载与安装图文教程
    k8s ingress 增加跨域配置
    Jenkins 备份恢复插件 thinBackup 使用
    k8s HA master 节点宕机修复
    nginx 跨域问题解决
    mongodb 3.4.24 主从复制
    k8s 线上安装 jenkins并结合 jenkinsfile 实现 helm 自动化部署
    k8s helm 运用与自建helm仓库chartmuseum
    centos6 源码安装 unzip
  • 原文地址:https://www.cnblogs.com/foolishnoob/p/9251802.html
Copyright © 2011-2022 走看看