首页 技术 正文
技术 2022年11月12日
0 收藏 830 点赞 2,952 浏览 2466 个字

代码片段一:

<?php
/**
* 观察者模式:定于对象间的一种一对多的依赖关系,当一个对象发生改变时,所有依赖它的对象都收到通知并自动更新。
*///例子:少林方丈的通讯录,当扫地僧的号码发生变化时,只需告诉方丈,方丈可通知自己通讯录里面的所有人
interface Contacts{
public function addTel($tel);
public function delTel($tel);
public function notify();
public function action($action);
}class StuContact implements Contacts{
public $contact;
public $action;
public function addTel($tel){
$this->contact[] = $tel;
}public function delTel($tel){
$key = array_search($tel, $this->contact);
if($key !== FALSE){
unset($this->contact[$key]);
}else{
echo '通讯录中无此人';
}
}public function notify(){
echo $this->action;
echo "<br/>";
foreach ($this->contact as $tel){
$tel->update();
echo "<br/>";
}
}public function action($action){
$this->action = $action;
}
}interface Tel{
public function update();
}class StuTel implements Tel{
public $name;
public function __construct($name){
$this->name = $name;
}public function update(){
echo $this->name.'收到消息,已经更新';
}
}class Client{
public static function main(){
$tel1 = new StuTel('虚竹');
$tel2 = new StuTel('乔峰');
$tel3 = new StuTel('段誉');$contacts = new StuContact();
$contacts->addTel($tel1);
$contacts->addTel($tel2);
$contacts->addTel($tel3);$contacts->action('扫地僧的号码更新了,是11111');
$contacts->notify();
}
}Client::main();
?>

  代码片段2

<?php
/*
* 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
* 类型:行为类模式
*
*
*///抽象主题角色
interface Subject
{
public function Attach($Observer); //添加观察者
public function Detach($Observer); //踢出观察者
public function Notify(); //满足条件时通知观察者
public function SubjectState($Subject); //观察条件
}//具体主题角色
class Boss Implements Subject
{
public $_action;
private $_Observer;
public function Attach($Observer)
{
$this->_Observer[] = $Observer;
}
public function Detach($Observer)
{
$ObserverKey = array_search($Observer, $this->_Observer);
if($ObserverKey !== false)
{
unset($this->_Observer[$ObserverKey]);
}
}
public function Notify()
{
foreach($this->_Observer as $value )
{
$value->Update();
}
}
public function SubjectState($Subject)
{
$this->_action = $Subject;
}
}//抽象观察者角色
abstract class Observer
{
protected $_UserName;
protected $_Sub;
public function __construct($Name,$Sub)
{
$this->_UserName = $Name;
$this->_Sub = $Sub;
}
public abstract function Update(); //接收通过方法
}
//具体观察者角色
class StockObserver extends Observer
{
public function __construct($name,$sub)
{
parent::__construct($name,$sub);
}
public function Update()
{
echo $this->_Sub->_action.$this->_UserName." 你赶快跑...";
}
}
$huhansan = new Boss(); //被观察者
$gongshil = new StockObserver("三毛",$huhansan); //初始化观察者
$huhansan->Attach($gongshil); //添加一个观察者
$huhansan->Attach($gongshil); //添加一个相同的观察者
//$huhansan->Detach($gongshil); //踢出基中一个观察者
$huhansan->SubjectState("警察来了"); //达到满足的条件
$huhansan->Notify(); //通过所有有效的观察者
?>

  UML类图如下

php实现设计模式之 观察者模式

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,487
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289