有些开发人员说:“WEB开发是所有开发类型中最难最复杂的。”说这句话的原因就是因为我们会面对各种不确定的因素,用户输入、平台、屏幕大小等等等等。。。。有这样一种情况,我们的产品能让用户选择不同的背景颜色,我们对各种颜色的背景经过数据分析后发现文字颜色,文字字体,文字大小都要变化才能达到最佳的效果,这些样式因数分别在不同的对象中,我们怎么让这些因数随同背景颜色变化。观察者模式就是用来在一个因素变化后通知其他对象,改变因数。
这个类就是引起变化的类
<?php
class Observer{
//用来保存要通知的不同对象
private static $objarray = array();
private $color;
function __construct($color){
$this->color = $color;
}
//改变参数用的方法
public function changcolor($color){
$this->color = $color;
$this->call($color);
}
//添加观察者
public static function addobserver($name, $obj){
$name = strtolower($name);
self::$objarray[$name] = $obj;
}
//删除相应的观察者
public static function subtractobserver($name){
$name = strtolower($name);
if (!self::$objarray[$name]){
echo "$name对应的对象不存在";
}
unset(self::$objarray[$name]);
}
//向各个对象通知的方法
private function call($color){
foreach (self::$objarray as $key => $value) {
$value->change($color);
}
}
}
//被通知的第一个对象
class Object1{
function change($value){
echo "第一个对象中 要被改成$value<br/>";
}
}
//被通知的第二个对象
class Object2{
function change($value){
echo "第一个对象中 要被改成$value";
}
}
调用过程有点复杂
//创建引起变化对象
$observer = new Observer("#ccc");
//创建第一个被变化的对象
$obj1 = new Object1();
//创建第二个被变化的对象
$obj2 = new Object2();
//向引起变化的对象中添加对象
Observer::addobserver('Object1', $obj1);
Observer::addobserver('Object2', $obj2);
//尝试引起因素的变化
$observer->changcolor('#abcdef');
//尝试删除一个对象后是否还有效
echo "<br/>";
Observer::subtractobserver('Object1');
$observer->changcolor('red');
这就是传说中的观察者。其实我觉的这个设计模式名字没有起好,应该叫推送者更合适。