设计模式之行为型模式—— 3.2 观察者模式

<?php

	/**
	 * 3.2 观察者模式
	 * 定义:
	 * 		它定义了一种一对多的依赖关系,让多个观察者
	 * 		对象同时监听某一个主题对象(通知者)。这个
	 * 		主题对象在状态发生变化时,会通知所有观察者
	 * 		对象,使它们能够自动更新自己。
	 * 角色:
	 * 		1. 抽象通知者
	 * 			职责:它把所有对观察者对象的引用保存在
	 * 				  一个聚集里,每个通知者都可以有任
	 * 				  何数量的观察者,抽象通知者提供一
	 * 				  个接口,可以增加和删除观察者对象。
	 * 		2. 具体通知者
	 * 			职责:具体通知者,将有关状态存入具体观
	 * 				  察者对象;在具体通知者的内部状态
	 * 				  改变时,给所有登记过的观察者发出
	 * 				  通知。
	 * 		3. 抽象观察者
	 * 			职责:为所有具体观察者定义一个接口,在
	 * 				  得到通知者的通知时更新自己。
	 * 		4. 具体观察者
	 * 			职责:实现抽象观察者角色所要求的更新接
	 * 				  口,以便使本身的状态与通知者的状
	 * 				  态相协调。
	 * 				  
	 * 	优点:
	 * 		1. 当两个对象之间送耦合,他们依然可以交互,
	 * 		   但是不太清楚彼此的细节。观察者模式提供了
	 * 		   一种对象设计,让主题和观察者之间送耦合。
	 * 		   主题所知道只是一个具体的观察者列表,每一
	 * 		   个具体观察者都符合一个抽象观察者的接口。
	 * 		   主题并不认识任何一个具体的观察者,它只知
	 * 		   道他们都有一个共同的接口。
	 * 		2. 观察者模式支持“广播通信”。主题会向所有的
	 * 		   观察者发出通知。
	 * 		3. 观察者模式符合“开闭原则”的要求。
	 * 
	 * 	缺点:
	 * 		1. 如果一个被观察者对象有很多的直接和间接的
	 * 		   观察者的话,将所有的观察者都通知到会花费
	 * 		   很多时间。
	 * 		2. 如果在观察者和观察目标之间有循环依赖的话
	 * 		   ,观察目标会触发它们之间进  行循环调用,
	 * 		   可能导致系统崩溃。
	 * 		3. 观察者模式没有相应的机制让观察者知道所观
	 * 		   察的目标对象是怎么发生变化的,而仅仅只是
	 * 		   知道观察目标发生了变化。
	 * 		   
	 * 	使用场景:
	 * 		1. 一个抽象模型有两个方面,其中一个方面依赖
	 * 		   于另一个方面。将这些方面封装在独立的对象
	 * 		   中使它们可以各自独立地改变和复用。
	 * 		2. 一个对象的改变将导致其他一个或多个对象也
	 * 		   发生改变,而不知道具体有多少对象将发生改
	 * 		   变,可以降低对象之间的耦合度。
	 * 		3. 一个对象必须通知其他对象,而并不知道这些
	 * 		   对象是谁。需要在系统中创建一个触发链,A对
	 * 		   象的行为将影响B对象,B对象的行为将影响C对
	 * 		   象…,可以使用观察者模式创建一种链式触发机
	 * 		   制。
	 * 
	 */

	//抽象通知者
	abstract class Subject{
		abstract public function attach(Observer $observer);
		abstract public function detach(Observer $observer);
		abstract public function notify();
		abstract public function getState();
		abstract public function setState($state);
	}
	//具体通知者
	//注:如果有多个通知者,那么可以将公共的方法在抽象
	//	  通知者中实现。
	class ConcreteSubject extends Subject{
		private $obsvs=array();
		private $state=‘‘;

		public function attach(Observer $observer){
			if(! in_array($observer, $this->obsvs)){
				$this->obsvs[]=$observer;
			}
		}
		public function detach(Observer $observer){
			if(in_array($observer, $this->obsvs)){
				$pos=array_search($observer, $this->obsvs);
				unset($this->obsvs[$pos]);
			}
		}
		public function notify(){
			foreach ($this->obsvs as $observer) {
				$observer->update();
			}
		}
		public function getState(){
			return $this->state;
		}
		public function setState($state){
			$this->state=$state;
		}
	}

	//抽象观察者
	abstract class Observer{
		protected $name;
		protected $sub;
		public function __construct($name,Subject $sub){
			$this->name=$name;
			$this->sub=$sub;
		}
		abstract public function update();
	}

	//具体观察者
	class ConcreteObserver extends Observer{
		public function update(){
			echo $this->sub->getState().‘,‘.$this->name.‘快点关闭游戏,继续工作!‘;
		}
	}

	//客户端
	$notify1=new ConcreteSubject();
	$observer1=new ConcreteObserver(‘张三‘,$notify1);
	$observer2=new ConcreteObserver(‘李四‘,$notify1);

	//将通知对象(即观察者)放入通知列表中
	$notify1->attach($observer1);
	$notify1->attach($observer2);
	$notify1->detach($observer2);

	//状态发生改变,观察者得到相应的状态通知后,做出
	//相应的动作。
	$notify1->setState(‘老板回来了‘);
	$notify1->notify();	

?>
时间: 2024-08-11 06:12:05

设计模式之行为型模式—— 3.2 观察者模式的相关文章

设计模式之行为型模式(一)

设计模式被分成了三大类型:创建型.结构型和行为型.本文介绍一下行为型模式中的观察者模式.模板方法模式.命令模式.状态模式和职责链模式. 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 优点:观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体.从而使得各自的变化都不会影响另一边的变化. 缺点:依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者. 应用:(1)当一个对象的改变需要给变其它对象时,而且

Java经典23种设计模式之行为型模式(三)

本文接着介绍11种行为型模式里的备忘录模式.观察者模式.状态模式. 一.备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态.还是比较好理解的. 1.Memento 备忘录存储原发器对象的内部状态,这个类就是要存储的对象的状态.状态需要多少个变量,在Memento里就写多少个变量. public class Memento { private String state; public Meme*to(String st

Java经典23种设计模式之行为型模式(一)

行为型设计模式有11种,分别是Chain of Responsibility ( 责任链模式 ).Command ( 命令模式 ).Interpreter ( 解释器模式 ) .Iterator ( 迭代器模式 ).Mediator ( 中介者模式 ) .Memento ( 备忘录模式 ) .Observer ( 观察者模式 ).State ( 状态模式 ) .Strategy ( 策略模式 ).TemplateMethod ( 模板方法 ).Visitor ( 访问者模式 ),本文介绍这11种

设计模式之创建型模式(上)

没有总结的学习不算学习,这一个月的学习可谓收获多多啊,接下来与大家分享一下. 一.设计模式的分类 总体来说设计模式分为三大类: 1.创建型模式,共五种. 2.结构型模式,共七种. 3.行为型模式,共十一种. 首先研究创建型模式 二. 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独 立于如何创建.组合和表示它的那些对象. 三. 为什么需要创建型模式 所有的创建型模式都有两个永恒的主旋律: 第一,它们都将系统使用哪些具体类的信息封装起来: 第二,它们隐藏了这些类的实例

设计模式 (创建型模式)

  设计模式 创建型模式 1.创建型模式         创建型模式,包括了5种设计模式,分别是 Singleton (单例模式),Factory(工厂模式),AbstractFactory(抽象工厂模式),Builder(创建者),Prototype(原型) ,创建型模式主要作用就是抽象了实例化过程.他们帮助一个系统独立于如何创建.组合和表示他的那些对象.一个类创建型模式使用继承改变被实例化的类.而一个对象创建型模式将实例化委托给另一个对象. 2.Singleton (单例模式)      单

设计模式(33)-----行为型模式-----访问者设计模式

访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作. 介绍 意图:主要将数据结构与数据操作分离. 主要解决:稳定的数据结构和易变的操作耦合问题. 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封

设计模式系列 - 创建型模式

单例模式 懒汉式,线程不安全. 除非是单线程程序,否则不推荐使用. public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 饿汉式,线程安全 当程序总是使用这个

NET设计模式 第二部分 行为型模式(18):观察者模式(Observer Pattern)

概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式结构图 生活中的例子

设计模式3—行为型模式

行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式: 1. 模板方法模式(Template Method Pattern)使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 2. 命令模式(Command Pattern)是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 3. 责任链模式(Chain of Responsibility Pattern),在该模式里,很多对象由每一个