`
GavinZheng
  • 浏览: 16023 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

观察者模式(Observer Pattern)

 
阅读更多
观察者模式(Observer Pattern):定义对象间一对多的关系。当对象的状态发生改变时,使其所依赖的对象得到通知并自动更新。

优点:
a. 观察者和被观察者之间抽象耦合。
b. 建立一套触发机制。
缺点:
a. 开发效率和运行效率。
b. 调试复杂,消息的通知是按顺序的,如果有一个观察者卡壳,会影响到整体效率,考虑使用异步解决。
使用场景:
a. 关联的行为场景。
b. 事件多级触发。
c. 跨系统的消息交换。如消息队列处理机制。
注意事项:
a. 广播链的问题:一个观察者有可能是被观察者,在观察者模式中最多只能出现一对既是观察者又是被观察者。
b. 异步处理的问题。
项目中真实的观察者模式:
a. 观察者和被观察者间的消息沟通:即观察者的update方法中接受两个参数,一个是被观察者自己,二是DTO(Data Transfer Object,数据传输对象),若远程传输,可考虑XML格式。
b. 观察者的响应问题:观者者较多时,需考虑性能问题,解决方法:
a) 多线程。
b) 缓存技术,即同步结构。
c) 被观察者尽量自己做主:在doingSomething(boolean isNotifyObs),做为判断是否向观察者发布消息。
订阅发布模型:如EJB 3.0中的消息驱动Bean便是观察者模式的升级版。
实践:
a. 文件系统。如新建一个文件,通知目录管理器增加目录,通知磁盘管理器减少磁盘空间。
b. 猫鼠游戏。猫叫一声,老鼠跑,主人醒等。
c. ATM机取钱。多次输入错误密码,吞卡时触发:一连续快拍,二通知监控系统,吞卡发生,三初始化ATM屏幕。前两个由观察者模式,后一个由异常完成。
d. 广播收音机。电台是被观察者,收音机是观察者。





package org.observer;

//观察者接口
public interface Observer {
	public void update();
}



package org.observer;

public class ConcreteObserver1 implements Observer {
	// 具体观察者的业务逻辑
	public void update() {
		System.out.println("我是ConcreteObserver1");
	}

}



package org.observer;

public class ConcreteObserver2 implements Observer {

	public void update() {
		System.out.println("我是ConcreteObserver2");
	}

}




package org.observer;

import java.util.Iterator;
import java.util.Vector;

//	被观察者的抽象类,功能:添加观察者,删除观察者,向所有观察者发布广播信息
//	类似JAVA中的事件驱动
public class Subject {
	private Vector<Observer> observers = new Vector<Observer>();

	public void addObserver(Observer o) {
		this.observers.add(o);
	}

	public void delObserver(Observer o) {
		this.observers.remove(o);
	}

	public void notifyObservers() {
		for (Observer o : this.observers) {
			o.update();
		}
	}
}



package org.observer;
//	被观察者,也有自己的方法接口
public interface ConcreteSubjectImp {

	public void firstMethod();

	public void secondMethod();

}



package org.observer;

public class ConcreteSubject1 extends Subject implements ConcreteSubjectImp {

	// 当调用第一个方法时,会向所有观察者发布消息
	public void firstMethod() {
		System.out.println("第一个方法");
		super.notifyObservers();
		System.out.println("-------------------------");
		System.out.println();
	}

	// 当调用第二个方法时,会向所有观察者发布消息
	public void secondMethod() {
		System.out.println("第二个方法");
		super.notifyObservers();
		System.out.println("-------------------------");
		System.out.println();
	}
}




package org.observer;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Observer concreteObserver1 = new ConcreteObserver1();
		Observer concreteObserver2 = new ConcreteObserver2();

		ConcreteSubject1 subject = new ConcreteSubject1();
		subject.addObserver(concreteObserver1);
		subject.addObserver(concreteObserver2);

		subject.firstMethod();
		subject.secondMethod();
	}

}



通过java.util中的类实现观察者模式
package org.observer.jdk;
//	被观察者,也有自己的方法接口
public interface ConcreteSubjectImp {

	public void firstMethod();

	public void secondMethod();

}



package org.observer.jdk;

import java.util.Observable;

public class ConcreteSubject1 extends Observable implements ConcreteSubjectImp {

	// 当调用第一个方法时,会向所有观察者发布消息
	public void firstMethod() {
		System.out.println("第一个方法");
		super.setChanged();
		super.notifyObservers("第一个方法");
		System.out.println("-------------------------");
		System.out.println();
	}

	// 当调用第二个方法时,会向所有观察者发布消息
	public void secondMethod() {
		System.out.println("第二个方法");
		super.setChanged();
		super.notifyObservers("第二个方法");
		System.out.println("-------------------------");
		System.out.println();
	}
}




package org.observer.jdk;

import java.util.Observable;
import java.util.Observer;

public class ConcreteObserver1 implements Observer {
	
	public void update(Observable o, Object arg) {
		System.out.println("我是ConcreteObserver1"+"-----"+arg.toString());
	}

}



package org.observer.jdk;

import java.util.Observable;
import java.util.Observer;

public class ConcreteObserver2 implements Observer {

	public void update(Observable o, Object arg) {
		System.out.println("我是ConcreteObserver2" + "-----" + arg.toString());
	}

}



package org.observer.jdk;

public class Client {

	public static void main(String[] args) {
		ConcreteObserver1 concreteObserver1 = new ConcreteObserver1();
		ConcreteObserver2 concreteObserver2 = new ConcreteObserver2();

		ConcreteSubject1 subject = new ConcreteSubject1();
		subject.addObserver(concreteObserver1);
		subject.addObserver(concreteObserver2);

		subject.firstMethod();
		subject.secondMethod();
	}

}


  • 大小: 29.8 KB
分享到:
评论

相关推荐

    swift-Swiftµframework实现观察者模式Observerpattern

    Swift µframework 实现观察者模式Observer pattern

    设计模式- 观察者模式 Observer Pattern详解

    首先,观察者模式的经典实现涉及两个主要对象:主题(Subject)和观察者(Observer)。主题维护一组观察者,并在状态变化时通知它们。观察者则订阅主题,以便在主题状态改变时接收通知。在C#中,这通常通过接口来...

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

    "ObserverPattern(订阅模式)3.zip"中的代码可能进一步阐述了观察者模式,这里的“订阅”一词可能意味着用户可以订阅特定的主题,只有当这些主题的状态改变时,用户才会收到通知。这与传统的观察者模式类似,但更加...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN ...16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    观察者模式observer

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

    ObserverPattern

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

    观察者模式,Observer

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

    [行为模式]head first 设计模式之观察者模式(observer)

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

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    observer-pattern-demo 观察者模式示例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,我们可以利用Java的内置接口`java.util.Observer`和`java.util....

    观察者模式(Observer)原理图

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

    java 观察者模式 demo

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

    观察者(Observer)模式详解

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

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

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

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

    观察者模式源码

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

    简单理解观察者模式(Observer)

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

    设计模式-观察者模式-作业-observer.zip

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

Global site tag (gtag.js) - Google Analytics