• 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、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

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

  • 相关阅读:
    内存管理简介之Buddy算法和slab分配
    进程通信方式介绍
    Linux内核网络栈实现分析(十一)驱动程序层(下)
    Linux内核网络协议栈深入分析(二)sk_buff的操作函数
    Linux内核网络协议栈深入分析(一)与sk_buff有关的几个重要的数据结构
    内核源码学习:伙伴算法
    寒假Day16Dinic模板更新+优化
    寒假Day20:数位dp
    寒假Day21:Catalan Square卡特兰数 JAVA写大数
    寒假Day17UVALive3231Fair Share(最大流+二分)
  • 原文地址:https://www.cnblogs.com/foolishnoob/p/9251802.html
Copyright © 2020-2023  润新知