用处:以前的一个类做一件事,而当需要做多件事的时候,就需要在同一个类中,改N多代码, 不便于维护和扩展,偶合依赖太强
然后,就有了观察者模式
逻辑图:
1、在原始类中,调用一个,父类中的一个方法notify()继承下来的; 此方法用于显示,所用的模板。
2、建立一个抽象类,在其中,创建两个方法
addobserver(),用于,增加对象(新的类);
notify(),用于显示或调用,该对象的update()方法,(由于添加的对象(类),可能不只一个,所以,得以数组的形式保存,并遍历调用update()方法)
3、创建一个Iobserver()一个接口类,在该类中创建一个update()方法;
4、然后,就可以创建新类了,而新类,就应用Iobserver接口,并实现update()方法;//这里就可以自定义代码
5、使用时,就用原始所类中所创建的对象,调用addobserver(new 新类);这样子就增加了一个模块,并且还实现了新的方法
<?php
define('BASEDIR',__DIR__);
require BASEDIR."/Phpclass/Loader.php";//引入一个能载入全部类的文件
spl_autoload_register('\Phpclass\Loader::autoload');//引用该类中自动注册文件的函数
class Page extends PhpclassObserverbase //0、扩展Observerbase类,里面一个add方法和一个note通知方法
{
function triger()
{
echo "逻辑一最初的显示
";
$this->notify();//1、调用父类的通知方法
}
}
class Observeer1 implements PhpclassIobserver //5、创建一个接口类,应用接口的方法,然后可进行相关的内容进行修改
{
function update($info=null){
echo "this is a new luoji 、
";
}
}
class Observeer2 implements PhpclassIobserver
{
function update($info=null){
echo "this is a new 更进一步
";
}
}
$page =new Page();
$page->addobserver(new Observeer1);//当前对象,调用父类的add方法,而传的对象,就是按接口规定的 对象,然后进行相关操作
$page->addobserver(new Observeer2);
$page->triger();
-----------------------------------------------------------------------------------------Index6.php
<?php
namespace Phpclass;
abstract class Observerbase
{
private $observers =array();
function addobserver( Iobserver $observer){//2、add类,相当于于把,新加的对象放到一个数组内
$this->observers[] = $observer;
}
function notify(){//3、通知方法,可以理解为把每个对象遍历,然后调用当前对象的update方法,而当前对象又在在规定的接口中
foreach ($this->observers as $observer)
{
$observer->update();//3.5、这里的update方法,就可以自己在新的类中,自定义了
}
}
}
-----------------------------------------------------------------------------------------Observerbase.php
<?php
namespace Phpclass;
interface Iobserver //4、接口中的update方法
{
function update($info = null);
}
-----------------------------------------------------------------------------------------Iobserver.php