《PHP实战:PHP设计模式之观察者模式实例》要点:
本文介绍了PHP实战:PHP设计模式之观察者模式实例,希望对您有用。如果有疑问,可以联系我们。
首先了解观察者模式的概念:一个对象通过添加一个办法(该办法允许另一个对象,即观察者 注册自己)使本身变得可观察.当可观察的对象更改时,它会将消息发送到已注册的观察者.这些观察者使用该信息执行的操作与可观察的对象无关.结果是对象可以相互对话,而不必了解原因.观察者模式是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间紧密耦.PHP教程
UML结构图:PHP教程
PHP教程
观察者模式办理的问题PHP教程
在我们的开发过程中,应该都或多或少的碰到过改动其中一部分代码会引起其他一连串改变的问题,显然想要完全避免这种情况不太可能,但我们也应答尽量减少对其他组件的依赖,而观察者模式就是为了办理这个问题.PHP教程
举个例子来说,我们有一个帖子对象,代码如下:PHP教程
class Post
{
protected $_userid = null;
protected $_ip = null;
protected $_content = null;
function __construct()
{
// ...
}
// 发帖方法
public function addPost()
{
// ... 发帖逻辑
}
}
在上面是一个普通的帖子对象,随着发帖量和拜访量越来越大,运营们开始不干了,公司也经常会接到投诉电话,说我们的网站有许多敏感内容和垃圾广告,因此我们需要做内容审核:首先是对用户的审核,一些黑名单用户应该被禁止发帖;二是对IP的审核;三是对内容敏感词的审核.因此我们的代码就成了如下的样子:PHP教程
class Post
{
protected $_userid = null;
protected $_ip = null;
protected $_content = null;
function __construct()
{
}
public function addPost()
{
if (!Postscan::checkUserid($tihs->_userid)) {
return false;
}
if (!Postscan::ipUserid($tihs->_ip)) {
return false;
}
if (!Postscan::checkContent($tihs->_content)) {
return false;
}
// ...
}
}
随着需要审核的字段越来越多,addPost办法变得越来越长,发布对象被也只能紧紧的被嵌入到该系统中.PHP教程
观察者模式的实现PHP教程
观察者模式的核心是把观察者从主体中分离开来,当主体知道事件发生时,观察需要被通知到,同时我们也不想把主体和观察者之间的关系写死,于是我们来修改下我们上面的代码:PHP教程
//主体必须实现的接口
interface Observable {
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
//观察者必须实现的接口
interface Observer {
public function do(Observable $subject);
}
class Post implements Observable
{
protected $_userid = null;
protected $_ip = null;
protected $_content = null;
protected $_observerlist = array();
function __construct()
{
}
public function attach(Observer $observer)
{
$this->_observerlist[] = $observer;
}
public function detach(Observer $observer)
{
foreach ($this->_observerlist as $key => $value) {
if ($observer === $value) {
unset($this->_observerlist[$key])
}
}
}
public function notify()
{
foreach ($this->_observerlist as $value) {
if (!$value->do($this)) {
return false;
}
}
return true;
}
public function addPost()
{
if (!$this->notify()) {
return false;
}
// ...
}
}
通过上面的代码,我们可以再很容易的加入审核规则.PHP教程
SPL代码PHP教程
观察者模式是一个很常见和常用的设计模式,以至于SPL扩展已经为我们封装好了对应的类和办法,下面的代码是根据SPL提供的3个元素:SplObserver,SplSubject,SplObjectStorage来实现的代码PHP教程
class Post implements SplSubject
{
protected $_userid = null;
protected $_ip = null;
protected $_content = null;
protected $_storage = new SplObjectStorage();
function __construct()
{
}
public function attach(SplObject $observer)
{
$this->_storage->attach($observer);
}
public function detach(SplObject $observer)
{
$this->_storage->detach($observer);
}
public function notify()
{
foreach ($this->_storage as $value) {
if (!$value->update($this)) {
return false;
}
}
return true;
}
public function addPost()
{
if (!$this->notify()) {
return false;
}
// ...
}
}
很简单吧,最重要的是理解,在这个例子中,我们把一些审核的办法从帖子类中剥离了开来,而且该帖子对象也可以用来作为其他的发布类型.PHP教程
以上内容实现是小编给大家介绍的PHP设计模式之观察者模式,希望对大家有所赞助!PHP教程
《PHP实战:PHP设计模式之观察者模式实例》是否对您有启发,欢迎查看更多与《PHP实战:PHP设计模式之观察者模式实例》相关教程,学精学透。维易PHP学院为您提供精彩教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/7525.html