中介者模式

原文链接:http://www.orlion.ga/749/

解释:

    中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接交互的情况下传送或调解对这些对象的集合的修改,处理具有类似属性并且属性需要保持同步的非耦合对象时,最佳的做法是使用基于中介者模式的对象

 

需求:

    同事类:有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是类A中数字的100倍。也就是说,当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。类A类B互相影响,就称为同事类。

class ColleagueA{

	private $number;

    public function setNumber($number, $coll) {
        $this->number = $number;  
		$coll->setNumber($number*100);
    }

    public function getNumber() {
    	return $this->number;
    }
}

class ColleagueB{

	private $number;
	
    public function setNumber($number) {
        $this->number = $number;  
    }

    public function getNumber() {
    	return $this->number;
    } 
}  

$collA = new ColleagueA();  
$collB = new ColleagueB();  
          
$collA->setNumber(1000, $collB);  
echo $collA->getNumber(); 
echo '<br/>'; 
echo $collB->getNumber();

    上面的代码中,类A类B通过直接的关联发生关系,假如我们要使用中介者模式,类A类B之间则不可以直接关联,他们之间必须要通过一个中介者来达到关联的目的。

代码:

class ColleagueA{

	public $number;

    public function setNumber($number , $mediator) {
        $this->number = $number;  
		$mediator->change($this , $number*100);
    }

    public function getNumber() {
    	return $this->number;
    }
}

class ColleagueB{

	public $number;

    public function setNumber($number , $mediator) {
        $this->number = $number;  
		$mediator->change($this , $number/100);
    }

    public function getNumber() {
    	return $this->number;
    }
} 

// 中介者
class Mediator{

	private $_a;

	private $_b;

	public function __construct(ColleagueA $a , ColleagueB$b) {
		$this->_a = $a;
		$this->_b = $b;
	}

	public function change($obj , $newNum) {
		if ($obj === $this->_a) {
			$this->_b->number = $newNum;
		} else if ($obj === $this->_b) {
			$this->_a->number = $newNum;
		}
	}
}

$collA = new ColleagueA();  
$collB = new ColleagueB();

$mediator = new Mediator($collA , $collB);
          
$collA->setNumber(1000, $mediator);
echo $collA->getNumber(); 
echo '<br/>'; 
echo $collB->getNumber();
posted @ 2016-04-03 21:59  orlion  阅读(198)  评论(0编辑  收藏  举报