• php实现设计模式之 中介者模式


    <?php 
    /*
     * 中介者模式:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互
     */
    
    /*
     * 以一个同学qq群为例说明,qq作为中介者,同学作为相互交互的对象
     */
    
    //抽象中介者,利用中介发送消息
    abstract class Mediator{
    	abstract function send($message,$user);
    }
    
    //抽象同事类,利用中介发送消息
    abstract class Colleague{
    	private $mediator;
    	
    	public function __construct($mediator){
    		$this->mediator = $mediator;
    	}
    	
    	public function send($message){
    		$this->mediator->send($message,$this);
    	}
    	
    	abstract function notify($message);
    }
    
    //具体的同事类a b c d e
    class StuA extends Colleague{
    	public function notify($message){
    		echo 'Stu A says: '.$message;
    		echo "<br/>";
    	}
    }
    
    class StuB extends Colleague{
    	public function notify($message){
    		echo 'Stu B says: '.$message;
    		echo "<br/>";
    	}
    }
    
    class StuC extends Colleague{
    	public function notify($message){
    		echo 'Stu C says: '.$message;
    		echo "<br/>";
    	}
    }
    
    class StuD extends Colleague{
    	public function notify($message){
    		echo 'Stu D says: '.$message;
    		echo "<br/>";
    	}
    }
    
    class StuE extends Colleague{
    	public function notify($message){
    		echo 'Stu E says: '.$message;
    		echo "<br/>";
    	}
    }
    
    //具体的中介者
    class QQ extends Mediator{
    	public $users = array();
    	
    	public function setUsers($user){//把对象添加进来
    		$this->users[] = $user;
    	}
    	
    	public function send($message, $user){//推送消息
    		for($i=0;$i<count($this->users);$i++){
    			if($user == $this->users[$i]){
    				$this->users[$i]->notify($message);
    			}
    		}
    	}
    }
    
    class Client{
    	public static function main(){
    		//流程:先建立中介者
    		$qq = new QQ();
    		//实例化交互对象
    		$stu_a = new StuA($qq);
    		$stu_b = new StuB($qq);
    		$stu_c = new StuC($qq);
    		$stu_d = new StuD($qq);
    		$stu_e = new StuE($qq);
    		//把对象加入中介者
    		$qq->setUsers($stu_b);
    		$qq->setUsers($stu_a);
    		$qq->setUsers($stu_c);
    		$qq->setUsers($stu_d);
    		$qq->setUsers($stu_e);
    		
    		//交流
    		$stu_a->send('昨天点名了吗,各位大神');
    		$stu_c->send('难道你没去');
    		$stu_a->send('是啊');
    		$stu_b->send('恭喜你中奖了');
    		$stu_d->send('恭喜你中奖了');
    		$stu_e->send('恭喜你中奖了');
    		$stu_a->send('我去');
    	}
    }
    
    Client::main();
    ?>
    

      UML类图如下

  • 相关阅读:
    BZOJ-1034-[ZJOI2008]泡泡堂BNB(贪心)
    BZOJ-2456-mode(思维题)
    POJ-2528-Mayor's posters(线段树+离散化)
    POJ-2352-Stars(树状数组)
    HDU-2688-Rotate(树状数组)
    POJ-1195-Mobile phones(二维树状数组)
    YYHS-NOIP2017Training0921-逆光
    YYHS-鏖战字符串(斜率优化)
    左偏树
    2-sat模板
  • 原文地址:https://www.cnblogs.com/taijun/p/4087147.html
Copyright © 2020-2023  润新知