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

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

  • 相关阅读:
    NYOJ-括号配对问题--------待解决,RE
    NYOJ-小猴子下落
    UVA401
    UVA11059
    生成1-N的排列
    C++ STL, next_permutation用法。
    C++ STL, set用法。 待更新zzzzz
    C++ STL, sort用法。
    C++中getline的用法
    TCP系列34—窗口管理&流控—8、缓存自动调整
  • 原文地址:https://www.cnblogs.com/foolishnoob/p/9251802.html
Copyright © 2011-2022 走看看