PHP设计模式——观察者模式
PHP版本
<?php
/**
* 观察者模式
* 观察者模式能够便利的创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定性功能。
*
* 为软件添加由某个动作或状态变化激活的,但是松散耦合的新功能时,应当创建基于观察者模式的对象。
*
* SPL:Standard PHP Library PHP标准库
*/ class User implements SplSubject{
public $lognum;
public $hobby;
protected $_observers = NULL; public function __construct($hobby) {
$this->lognum = rand(1,10);
$this->hobby = $hobby;
$this->_observers = new SplObjectStorage();
} public function login() {
$this->notify();
} public function attach(SplObserver $observer) {
$this->_observers->attach($observer);
}
public function detach(SplObserver $observer) {
$this->_observers->detach($observer);
}
public function notify() {
$this->_observers->rewind();
while ($this->_observers->valid()) {
$observer = $this->_observers->current();
$observer->update($this);
$this->_observers->next();
}
}
}
/**
* 功能模块
*/
class Login implements SplObserver{
public function update(SplSubject $subject) {
echo "登录次数:".$subject->lognum.'<br>';
}
}
//实施观察
$user = new User('学习');
$user->attach(new Login());
$user->login(); //添加模块
class Hobby implements SplObserver{
public function update(SplSubject $subject) {
echo "爱好:".$subject->hobby;
}
}
$hobby = new Hobby;
$user->attach($hobby);
$user->login();
echo '<br>';
//删除观察模块
$user->detach($hobby);
$user->login();
JS版本
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>观察者模式</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
div{border:solid gray 1px;margin-top:10px;height: 100px;width: 200px;}
</style>
</head>
<body>
<h1>观察者模式</h1>
<select>
<option value="1">风格1</option>
<option value="2">风格2</option>
</select>
<button onclick="detachC()">不观察C</button>
<button onclick="attachC()">观察C</button>
<!--模块一-->
<div id="A">A</div>
<!--模块二-->
<div id="B">B</div>
<!--模块三-->
<div id="C">C</div>
<script>
//观察者
var sel = document.getElementsByTagName('select')[0];
sel.observers = {}
sel.attach = function(key, obj) {
this.observers[key] = obj;
}
sel.detach = function(key) {
delete this.observers[key];
} sel.onchange = sel.notify = function() {
for (var key in this.observers) {
this.observers[key].update(this);
}
}
//被观察对象及操作
var a = document.getElementById('A');
var b = document.getElementById('B');
a.update = function(observe) {
if (1 == observe.value) {
this.innerHTML = 'A模块:风格1';
}
if (2 == observe.value) {
this.innerHTML = 'A模块:风格2';
}
}
b.update = function(observe) {
if (1 == observe.value) {
this.innerHTML = 'B模块:风格1';
}
if (2 == observe.value) {
this.innerHTML = 'B模块:风格2';
}
}
//开启观察
sel.attach('a', a);
sel.attach('b', b); //添加观察C模块
var c = document.getElementById('C');
c.update = function(observe) {
if (1 == observe.value) {
this.innerHTML = 'C模块:风格1';
}
if (2 == observe.value) {
this.innerHTML = 'C模块:风格2';
}
}
sel.attach('c', c); //取消观察
function attachC(){
sel.attach('c',c);
}
function detachC(){
sel.detach('c');
}
</script>
</body>
</html>
PHP设计模式——观察者模式的更多相关文章
- 18. 星际争霸之php设计模式--观察者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- js设计模式-观察者模式
定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...
- 【设计模式】Java设计模式 - 观察者模式
[设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...
- [Head First设计模式]山西面馆中的设计模式——观察者模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...
- javascript 设计模式-----观察者模式
观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...
- c#设计模式-观察者模式
Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...
- JAVA 设计模式 观察者模式
用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...
- IOS设计模式-观察者模式
前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...
随机推荐
- logrtate 切割详解
Logrotate是Linux下一款日志管理工具,可用于日志文件的转储(即删除旧日志文件,创建新日志文件).可以根据日志大小或者按照某时段间隔来转储,内部使用cron程序来执行.Logrotate还可 ...
- Java基础17-成员变量、return关键字和多参方法
1.成员变量 在类中声明的变量为成员变量 //Dog类 class Dog{ String name;//成员变量 } public class Test1{ public static void m ...
- WEB 倒计时
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...
- 第十六章:自定义push notification sound
前面一节已经讲过如何在ionic中集成jpush,这样我们的hybrid app在部署到ios或者android上面的时候,就可以接收通知了.如果不满足系统自带的声音,可以通过一些方式来播放自定义的通 ...
- Java Web基础——Action+Service +Dao三层的功能划分 (转载)
原文:https://blog.csdn.net/inter_peng/article/details/41021727 仅供自己学习使用: 1. Action/Service/DAO简介: Acti ...
- Ubuntu Cloud Image in Openstack
Ubuntu出的云环境镜像(http://uec-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img),已经 ...
- 二维数组针对某字段排序 - array_multisort()
/** * 针对二维数组下的某字段排序 * @param array $myarr 被排序数组 * @param string $sort_key 排序根据字段 * @param flag $sort ...
- android自定义控件——以滑动开关为例
0.引言 (1)Android从4.0开始提供了switch的滑动开关效果组件,但是之前版本却没有 (2)很多时候我们写程序,都希望把有用的通用的通用的东西封装起来,以便以后重用. 本文根据组件开发思 ...
- android 5.0 下载编译
CM的CM-12.0版本(对应Android5.0.2): $ repo init -u https://github.com/CyanogenMod/android.git -b cm-12.0 注 ...
- Android 自定义倾斜字体
public class RotateTextView extends AppCompatTextView { private static final int DEFAULT_DEGREES = 0 ...