大话设计模式第十四章--观察者模式

<?php
abstract class Subject {
    private $_observers = array();

    public function attach(Observer $observer) {
        $this->_observers[] = $observer;
    }

    public function detach(Observer $observer) {
        if (isset($this->_observers[$observer])) {
            unset($this->_observers[$observer]);
        }
    }

    public function notify() {
        foreach ($this->_observers as $observer) {
            $observer->update();
        }
    }
}

abstract class Observer {
    abstract public function update();
}

class Concrete_subject extends Subject {
    private $subject_state;

    public function __set($param, $value) {
        if ($param == ‘subject_state‘) {
            $this->subject_state = $value;
        }
    }
    public function __get($param) {
        if ($param == ‘subject_state‘) {
            return $this->subject_state;
        }
    }
}

class Concrete_observer extends Observer {
    private $name;
    private $observer_state;
    private $subject;

    public function __construct(Concrete_subject $subject, string $name) {
        $this->subject = $subject;
        $this->name = $name;
    }

    public function update() {
        $this->observer_state = $this->subject->subject_state;
        echo "OBSERVER ".$this->name." ‘s STATUS IS".$this->observer_state."<br/>";
    }

    public function __set($param, $value) {
        if ($param == ‘subject‘) {
            $this->subject = $value;
        }
    }
    public function __get($param) {
        if ($param == ‘subject‘) {
            return $this->subject;
        }
    }
}

//CLIENT CODE
$s = new Concrete_subject();
$s->attach(new Concrete_observer($s, ‘X‘));
$s->attach(new Concrete_observer($s, ‘Y‘));
$s->attach(new Concrete_observer($s, ‘Z‘));

$s->subject_state = ‘ABC‘;
$s->notify();

观察者模式:

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

何时使用:

  当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式;

  当一个抽象模型有两个方面,其中一个方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用;

总结:

  总的来说,观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。

另:Observer抽象类 也可以用接口实现。

时间: 2024-11-10 12:59:23

大话设计模式第十四章--观察者模式的相关文章

大话设计模式第十六章--状态模式

<?php abstract class State { abstract public function handle(Context $context); } class Concrete_state_A extends State { public function handle(Context $context) { echo "NOW IS IN STATE_A <br/>"; $context->state = new Concrete_state_

大话设计模式第十二章---外观模式PHP实现

<?php class Sub_system_one { public function method_one() { echo "subsystem one method one<br/>"; } } class Sub_system_two { public function method_two() { echo "subsystem one method two<br/>"; } } class Sub_system_three

设计模式之第18章-观察者模式(Java实现)

设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说来自意大利电影<滴露牡丹开>中一个专门偷拍明星照片的一个摄影师的名字,“Paparazzo”,中文译为帕帕拉齐,俗语就是狗仔队.这些明星因狗仔队而荣,获得曝光率,也因狗仔队而损,被曝光负面新闻,不管怎么说,总之是“火起来了”,让明星们又爱又恨.(众人:鱼哥,你扯远了).咳咳,这个狗仔队其实嘛,也就

javascript高级程序设计 第十四章--表单脚本

javascript高级程序设计 第十四章--表单脚本 在HTML中表单由<form>元素表示,在js中表单对应的是HTMLFormElement类型,这个类型也有很多属性和方法:取得表单元素的引用还是为它添加id特性,用DOM操作来获取表单元素:提交表单:把<input>或<button>元素的type特性设置为"submit",图像按钮把<input>元素的type特性设置为"image",也可以调用submit(

java-第十四章-代参的方法(二)-实现MyShopping系统的添加会员功能

 package com.wxws.sms; public class Customer {  int No;  int integarl; } package com.wxws.sms; public class Customers {  Customer[] customers = new Customer[100];  public void add(Customer cust){   for (int i = 0; i <customers.length; i++) {    if (c

java-第十四章-代参的方法(二)-查找会员积分

 package com.wxws.smsB; public class Customer {  int No;  int integarl; } package com.wxws.smsB; public class Customers {  Customer[] customers = new Customer[100];  public void add(Customer cust) {   for (int i = 0; i < customers.length; i++) {    i

R in action读书笔记(19)第十四章 主成分和因子分析

第十四章:主成分和因子分析 本章内容 主成分分析 探索性因子分析 其他潜变量模型 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分.探索性因子分析(EFA)是一系列用来发现一组变量的潜在结构的方法.它通过寻找一组更小的.潜在的或隐藏的结构来解释已观测到的.显式的变量间的关系. PCA与EFA模型间的区别 主成分(PC1和PC2)是观测变量(X1到X5)的线性组合.形成线性组合的权重都是通过最大化各主成分所解释的方差来获得,同时还要保证个

c++第十四章-(类型强转换)

类型强转换有2种. class Company { public: Company(std::string theName,std::string theProduct); virtual void printInfo(); protected: std::string name; std::string product; }; Company::Company(std::string theName,std::string theProduct) { this->name = theName;

Java-第十四章-代参的方法(二)-编程实现,输入班里10名学生的身高,获得身高最高的学生要求对象数组类型方法

package com.ww.yzpA; public class Students { int No; int Height; } package com.ww.yzpA; public class Height { public Students getMaxHeigth(Students[] str) { Students A = new Students(); for (int i = 0; i < str.length; i++) { if (str[i].Height > A.He