PHP设计模式中观察者模式的一个例子
首先,理解观察者模式的概念:一个对象通过添加一个允许另一个对象(即观察者)注册自己的方法,使自己变得可观察。当可观察的对象发生变化时,它会向注册的观察者发送消息。这些观察者利用这些信息进行的操作与可观察的物体无关。结果是,对象可以在不知道为什么的情况下相互交谈。观察者模式是一个事件系统,这意味着这个模式允许一个类观察另一个类的状态。当被观察类状态发生变化时,被观察类可以收到通知并做出相应的动作。观察者模式为您提供了避免组件之间紧密耦合的能力。
UML结构图:
观察者模式解决的问题。
在我们的开发过程中,我们都应该遇到这样的问题,改变一些代码会导致一系列其他的变化。显然,完全避免这种情况是不可能的,但我们也回答,我们应该尽量减少对其他组件的依赖,而观察者模式就是为了解决这个问题。
例如,我们有一个包含以下代码的post对象:
类Post { protected $ _ userid=null受保护的$ _ ip=null受保护的$ _ content=nullfunction __construct(){//.}//发帖方法公共函数addPost(){//.发帖逻辑}}是一个普通的发帖对象。随着发文量和访问量的不断增加,运营商开始退出,公司经常接到投诉电话,说我们的网站有很多敏感内容和垃圾广告,需要做内容审核:第一,是对的。二是对知识产权的审查;第三,内容敏感词的复习。所以我们的代码是这样的:
类Post { protected $ _ userid=null受保护的$ _ ip=null受保护的$ _ content=nullfunction _ _ construct(){ } public function addPost(){ if(!postscan : checkuserid($ tihs-_ userid)){返回false}if(!postscan : I pserid($ tihs-_ IP)){ return false;}if(!postscan : check content($ tihs-_ content)){ return false;}//.}}随着需要审计的字段越来越多,addPost方法变得越来越长,发布的对象只能紧紧的嵌入到系统中。
观察者模式的实现。
观察者模式的核心是将观察者与主体分离。当主体知道事件时,观察需要被告知,我们不想把主体和观察者的关系写死,所以我们将修改我们上面的代码:
//主体必须实现的接口interface observable { public function attach(observer $ observer );公共函数分离(观察者$ Observer);公共函数notify();}//Interface Observer { public function do(observable $ subject),观察者必须实现;Post类实现了可观察的{ protected $ _ userid=null受保护的$ _ ip=null受保护的$ _ content=null受保护的$ _ observer list=array();function _ _ construct(){ } public function attach(Observer $ Observer){ $ this-_ Observer list[]=$ Observer;}公共函数detach(Observer $ Observer){ foreach($ this-_ Observer list as $ key=$ value){ if($ Observer==$ value){ unset($ this-_ Observer list[$ key])} }公共函数notify(){ foreach($ this-_ Observer list as $ value){ if(!$ value-do($ this)){ return false;} }返回true}公共函数addPost(){if(!$ this-notify()){ return false;}//.}}通过上面的代码,我们可以轻松加入审核规则。
SPL法典
观察者模式是一种非常常见和常用的设计模式,以至于SPL扩展为我们封装了相应的类和方法。下面的代码是根据SPL提供的三个元素实现的:SPL观察者、SPL主体和SPL对象存储。
邮政类实现sp subject { protected $ _ userid=null;受保护的$ _ ip=null受保护的$ _内容=空受保护的$ _ storage=new SplObjectstorage();function _ _ construct(){ } public function attach(SplObject $ observer){ $ this-_ storage-attach($ observer);} public function detach(SplObject $ observer){ $ this-_ storage-detach($ observer);}公共函数notify(){ foreach($ this-_ storage as $ value){ if(!$ value-update($ this)){ return false;} }返回真}公共函数addPost(){if(!$ this-notify()){ return false;}//.}}很简单吧,最重要的是理解,在这个例子中,我们把一些审核的方法从帖子类中剥离了开来,而且该帖子对象也可以用来作为其他的发布类型。
以上内容实现是小编给大家介绍的服务器端编程语言(专业超文本预处理器的缩写)设计模式之观察者模式,希望对大家有所帮助!
版权声明:PHP设计模式中观察者模式的一个例子是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。