您的位置:首页 > 编程语言 > PHP开发

PHP设计模式——观察者模式

2017-06-15 11:19 459 查看
声明:本系列博客參考资料《大话设计模式》,作者程杰。

观察者模式(有时又被称为公布-订阅模式)。

在此种模式中,一个目标物件管理全部相依于它的观察者物件。而且在它本身的状态改变时主动发出通知。

这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

UML类图:



重要角色:

抽象通知者角色(INotifier):定义了通知的接口规则。

详细通知者角色(Boss):实现抽象通知者的接口,接到状态改变马上向观察者下发通知。

抽象观察者角色(IObserver):定义接到通知后所做的操作(Update)接口规则。

详细观察者角色(JingDong):实现详细操作方法。

核心代码:

//抽象通知者
abstract class Subject
{
private $observers = array();

public function  Attach(Observer $observer)
{
array_push($this->observers,$observer);
}

public function  Detach(Observer $observer)
{
foreach($this->observers as $k=>$v)
{
if($v==$observer)
{
unset($this->observers[$k]);
}
}
}

function  Notify()
{
foreach($this->observers as $v)
{
$v->Update();
}
}
}

//详细通知者(Boss和Secretary)
class ConcreteSubject extends Subject
{
public $subject_state;
}

//抽象观察者
abstract class Observer
{
public abstract function Update();
}

//详细观察者
class ConcreteObserver extends Observer
{
private $name;
private $observerState;
public $subject;

public function __construct(ConcreteSubject $_sub,$_name)
{
$this->subject = $_sub;
$this->name = $_name;
}

public function  Update()
{
$this->observerState = $this->subject->subject_state;
echo "观察者".$this->name."的新状态是:".$this->observerState."<br/>";
}
}


调用client代码:

header("Content-Type:text/html;charset=utf-8");
//-------------------------观察者模式-----------------------
require_once "./Observe/Observe.php";
//前台
$_s = new ConcreteSubject();

//宝银
$baoyin = new ConcreteObserver($_s, "张三");
$jiangchao = new ConcreteObserver($_s,"李四");

//前台记下宝银姜超
$_s->Attach($baoyin);
$_s->Attach($jiangchao);

//前台发现老板回来
$_s->subject_state = "孙总回来了";

//前台发送通知
$_s->Notify();


长处:

1、一个抽象模型有两个方面,当中一个方面依赖于还有一个方面。

将这些方面封装在独立的对象中使它们能够各自独立地改变和复用。

2、一个对象的改变将导致其它一个或多个对象也发生改变。而不知道详细有多少对象将发生改变,能够减少对象之间的耦合度。

3、一个对象必须通知其它对象,而并不知道这些对象是谁。须要在系统中创建一个触发链。A对象的行为将影响B对象。B对象的行为将影响C对象……。能够使用观察者模式创建一种链式触发机制。

欢迎关注我的视频课程,地址例如以下,谢谢。

PHP面向对象设计模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: