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设计模式——观察者模式的更多相关文章

  1. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  3. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  4. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  5. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  6. [Head First设计模式]山西面馆中的设计模式——观察者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...

  7. javascript 设计模式-----观察者模式

    观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...

  8. c#设计模式-观察者模式

    Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...

  9. JAVA 设计模式 观察者模式

    用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...

  10. IOS设计模式-观察者模式

    前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...

随机推荐

  1. 一个新时代的UI设计师需要具备这些技能

    如今互联网行业发展如日中天,设计师本就是稀缺人才.再加上未来也将迎接人工智能时代,未来的设计师不只像现在只是做一些网页.APP界面,还会出现更多的UI设计衍生职业.如下列举的几大类: 一.初级阶段 1 ...

  2. Tortoise SVN安装后右键没有菜单的解决方法

    最近换了WIN7的操作系统,感觉用起来爽极了,于是开始一个个装软件,最让我头疼的就是安装SVN,安装没有问题,完成后却无法显示右键菜单,开始同事也帮我找原因,以为是我设置问题或者哪里阻止了程序,还以为 ...

  3. mvp需要加上单利模式

    最大的中介者,需要设置成单利模式

  4. Excel&&word&&PPT

    1. Excel 1.1 制作下拉框 选中单元格或列--> 菜单"数据" --> "数据验证"-->"设置" --> ...

  5. Lubuntu"软件包 没有可安装的候选者"解决办法

    在用VMware 安装 Lubuntu 虚拟机时,为了减少安装程序下载更新软件包的时间(安装程序默认的软件源速度较差,而且当某一软件包下载卡住,安装程序竟然要一直等待,这个过程通常会耗用大量时间,有时 ...

  6. core核心模块

    5. core核心模块 核心模块会通过compiler模块提供的调用compiler的功能, 将用户的输入转为VM直接的输入 编译模块用来编译, 而核心模块用来执行 在core.h文件中 // 不需要 ...

  7. 用Gvim建立IDE编程环境 (Windows篇)

    转自:http://my.oschina.net/kontor/blog/50717 0.准备软件及插件.(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gv ...

  8. jquery点击事件后增加克隆的标签,并改变克隆的属性加入

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. jQuery前端数据通用验证库,解放你的双手

    这个简易的验证库,应该能完成90%的基本验证,包括失去焦点时的验证,以及点击提交按钮时的验证.后端的那我就无能为办了,只能是谁用就谁自个儿去写了:). 先上一段调用的代码吧,JS代码说少也不少了,就不 ...

  10. 【学习笔记】Java中生成对象的5中方法

    概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...