`
flyingdutchman
  • 浏览: 358450 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

设计模式:观察者模式

阅读更多
        观察者模式是一种常用的依赖之间松耦合的设计模式,又叫发布-订阅(Publish/Subscribe)模式或监听模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象——被监听者——在状态上发生变化时,会通知所有观察者对象(监听者),使它们能够自动更新自己。
        在平常的生活中,很多人都喜欢听单田芳老爷子讲的评书,通常是在每天12:30开讲,这时候喜欢评书的听众会把收音机调到某个有单老爷子评书的频道,就可以收听自己喜欢的评书了。造这个示例中,有单老爷子评书的频道就是一个主题,而听众就是观察者,而观察者将收音机频道调到评书的的频道的动作就是注册事件。
        在观察者模式中,又分为推模型和拉模型两种方式。
      ●推模型
     主题对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。
      ●拉模型
     主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象
        观察者模式的优点:
            ●支持松耦合和减少依赖性。客户端不再依赖于观察器,因为通过使用主体和 Observer 接口对客户端进行了隔离。许多框架具有此优点,在这些框架中的应用程序组件可以注册为当(低级)框架事件发生时得到通知。结果,框架将调用应用程序组件,但不会依赖于它。
            ●观察器数目可变。观察器可以在运行时附加和分离,因为主体对于观察器数目没有任何假定。此功能在这样的情况下是很有用的:观察器数在设计时是未知的。例如,如果用户在应用程序中打开的每个窗口都需要一个观察器。
        我们本节主要讲基于“推模型”的观察者模式。
        下面我们来看一下观察者模式的类图:

         Subject角色:可以是一个接口或抽象类,主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;
         Observer角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;
         ConcreteSubject角色:具体主题,保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;
         ConcreteObserver角色:具体观察者,保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。
         下面我们再来看一下具体的代码:
package org.pattern.observer;

/**
 * 主题接口
 * @author JackyChen
 *
 */
public interface ISubject {
	
	/**
	 * 注册观察者
	 * @param observer 观察者
	 */
	void attach(IObserver observer);
	
	/**
	 * 删除观察者
	 * @param observer 观察者
	 */
	void detach(IObserver observer);
	
	/**
	 * 给所有观察者发信息
	 */
	void notifyObservers();

}
         

        
package org.pattern.observer;

/**
 * 观察者接口
 * @author JackyChen
 *
 */
public interface IObserver {
	
	void update(String msg);

}
         

        
package org.pattern.observer;

/**
 * 具体观察者
 * @author JackyChen
 *
 */
public class ConcreteObserver implements IObserver {

	/**
	 * @param msg 从主题接收到的信息
	 */
	public void update(String msg) {
		System.out.println("Observer(" + this.hashCode() + ") 接收到了:" + msg);
		//具体逻辑由用户决定...
	}

}
         

        
package org.pattern.observer;

import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 具体主题
 * @author JackyChen
 *
 */
public class ConcreteSubject implements ISubject {
	
	private Vector<IObserver> observersVector = new Vector<IObserver>();
	/**
	 * Executors.newFixedThreadPool线程池线程数,由服务器可用的CPU核心数量决定
	 */
	private static final int numThread = Runtime.getRuntime().availableProcessors()
;

	@Override
	public void attach(IObserver observer) {
		observersVector.add(observer);
	}

	@Override
	public void detach(IObserver observer) {
		observersVector.remove(observer);
	}

	@Override
	public void notifyObservers() {
		//这个方法会有一些问题,由于是在ConcreteSubject线程内遍历观察者列表,
		//故如果某一个观察者爆了异常的话,其他的观察者就不会被调用,可以改为
		//由多线程来对每一个观察者的调用
		/**
		 * for(IObserver observer : observersVector){		 
		 *	 observer.update(this.hashCode() + " 状态变了。");
		 * }
		 */
		ExecutorService exec = Executors.newFixedThreadPool(numThread);
		for(final IObserver observer : observersVector){
			exec.execute(new Runnable(){
				@Override
				public void run() {
					observer.update("状态变了。");
				}
				
			});
		}
		exec.shutdown();
	}

}
         
  • 大小: 7 KB
分享到:
评论

相关推荐

    设计模式:观察者模式java和javabean

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...

    软件设计模式:观察者模式.zip

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动编程、发布/订阅系统...

    快速学习C++设计模式:观察者模式实例代码

    观察者模式是目前应用最广、影响范围最大的模式之一,因为 Observer 的一个实例 MVC结构(Model/View/Control )在系统开发架构设计中有着很重要的地位和意义,实现了业务逻辑和表示层的解耦。下面示例代码以篮球...

    设计模式例子,观察者模式,建造者模式

    在给定的压缩包文件中,"设计模式例子,观察者模式,建造者模式" 提到了两种重要的设计模式:观察者模式(Observer Pattern)和建造者模式(Builder Pattern)。下面我们将深入探讨这两种设计模式的概念、应用场景、...

    设计模式,观察者模式

    ### 设计模式:观察者模式详解 #### 一、引言 在软件开发过程中,我们经常需要处理对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都应得到通知并自动更新。这正是观察者模式(Observer ...

    设计模式:基于C#的工程化实现及扩展(完整电子版)

    这些模式在不同的开发环境中都展现出其价值,包括单例模式、工厂模式、观察者模式、装饰器模式、适配器模式、建造者模式等。 在C#中,我们可以利用面向对象的特性,如类、接口和继承,来实现这些设计模式。例如,...

    设计模式:可复用面向对象软件的基础(非扫描版+高清)

    设计模式分为三类:创建型模式(如单例模式、工厂方法模式)、结构型模式(如代理模式、装饰器模式)和行为型模式(如观察者模式、策略模式)。每种模式都有其特定的用途和适用场景。 4. **具体设计模式详解** - ...

    《设计模式:可复用面向对象软件的基础》英文版

    例如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    设计模式-观察者

    观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...

    设计模式:可复用面向对象软件的基础--详细书签版

    5.7 observer(观察者)—对象行为型 模式 194 5.8 state(状态)—对象行为型模式 201 5.9 strategy(策略)—对象行为型 模式 208 5.10 template method(模板方法) —类行为型模式 214 5.11 visitor...

    设计模式之观察者模式

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动编程、发布/订阅系统...

    设计模式-观察者模式(讲解及其实现代码)

    总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高了代码的灵活性和可扩展性。在实际项目中,正确使用观察者模式可以有效地管理组件间的...

    Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况

    观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ### 一、观察者模式概念 观察者模式的核心思想是让主题(Subject)...

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    java23种设计模式之观察者模式

    **观察者模式(Observer Pattern)**是软件设计模式中的一种行为模式,它在Java中有着广泛的应用。这个模式的核心思想是“一对多”的依赖关系,即一个主题对象(Subject)可以被多个观察者(Observer)关注,当主题...

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

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

Global site tag (gtag.js) - Google Analytics