`
lingyibin
  • 浏览: 196386 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式--Observer模式

阅读更多

观察者模式,简单来说,就是允许一个事物(观察者)监听、观察另一个事物(主体),当主体有事件发生时,就自动地做出相应的变化。他们之间形成一种发布/订阅(publish-subscribe)的关系。通过这种模式,观察者可以注册监听主体的事件,而当主体要通知观察者的时候,它只需要把事件发送给各个观察者。

用这种模式的好处是:它使两个有调用关系的类之间降低了耦合关系,事件的主体不需要知道任何关于观察者的信息,相应地,它只需允许观察者来订阅事件。

下面写一个例子,通过例子来加深理解。

先定义两个接口:观察者和事件的主体

 

public interface Observer {
	public void update(Subject s);
}

 

public interface Subject {
	public void addObserver(Observer o);
	public void removeObserver(Observer o);
}

 再来写个类 实现 主体的接口,一方面用来管理类,另一方面用来管理(存储数据)。本例子中,主要实现两个功能:一把一串数字相加,二把一串数字打出来。

import java.util.ArrayList;
import java.util.Iterator;
import cn.ling.observer.interfaces.Observer;
import cn.ling.observer.interfaces.Subject;

public class IntegerDataBag implements Subject{

	private ArrayList<Observer> observers = new ArrayList<Observer>();
	
	@Override
	public void addObserver(Observer o) {
		observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		observers.remove(o);
	}

	
	private ArrayList<Integer> listInt = new ArrayList<Integer>();
	public void addInt(Integer i){
		listInt.add(i);
		//注意,加入一个整数时就要通知一下观察者,这步很关键
		notifyObservers();
	}
	public Integer remove(int index){
		if(index < listInt.size()){
			Integer i = listInt.remove(index);
			//注意,删除一个整数时也要通知一下观察者,这步很关键
			notifyObservers();
			return i;
		}
		return null;
	}
	public Iterator<Integer> iterator(){
		return listInt.iterator();
	}
	
	public void notifyObservers(){
		Iterator<Observer> it = observers.iterator();
		while(it.hasNext()){
			it.next().update(this);
		}
	}
}

 再来实现观察者接口。

这些类用来处理事件的主体发出相应的动作时执行的具体过程。

首先是观察累加的事件

import java.util.Iterator;
import cn.ling.observer.interfaces.Observer;
import cn.ling.observer.interfaces.Subject;

public class IntegerAdder implements Observer {

	private IntegerDataBag bag;
	public IntegerAdder(IntegerDataBag bag){
		this.bag = bag;
		bag.addObserver(this);
	}
	
	@Override
	public void update(Subject s) {
		if(s == bag){
			System.out.println("1内容改变了!");
			int counter = 0;
			Iterator<Integer> it = bag.iterator();
			while(it.hasNext()){
				counter += it.next();
			}
			System.out.println("这些数据的总和是:"+counter);
		}
	}
}

 其次是观察打印的事件

import java.util.Iterator;
import cn.ling.observer.interfaces.Observer;
import cn.ling.observer.interfaces.Subject;

public class IntegerPrinter implements Observer {

	private IntegerDataBag bag;
	public IntegerPrinter(IntegerDataBag bag){
		this.bag = bag;
		bag.addObserver(this);
	}
	
	@Override
	public void update(Subject s) {
		if(s == bag){
			System.out.println("2内容改变了!");
			Iterator<Integer> it = bag.iterator();
			while(it.hasNext()){
				System.out.println(it.next());
			}
		}
	}

}

 最后,我们写一个主类来测试一下:

public class MainTest {

	/**
	 * @param args
	 */
	@SuppressWarnings("unused")
	public static void main(String[] args) {
		IntegerDataBag bag = new IntegerDataBag();
		bag.addInt(new Integer(1));
		bag.addInt(new Integer(2));
		bag.addInt(new Integer(3));
		bag.addInt(new Integer(4));
		bag.addInt(new Integer(5));
		bag.addInt(new Integer(6));
		bag.addInt(new Integer(7));
		bag.addInt(new Integer(8));
		
		IntegerAdder adder = new IntegerAdder(bag);
		IntegerPrinter printer = new IntegerPrinter(bag);
		
		System.out.println("-->再加入一个新的数字");
		bag.addInt(new Integer(9)); //加入时会触发观察者事件

		System.out.println("");
		System.out.println("-->移除一个数字");
		bag.remove(0);
	}

}

 结果如下:

-->再加入一个新的数字
1内容改变了!
这些数据的总和是:45
2内容改变了!
1
2
3
4
5
6
7
8
9

-->移除一个数字
1内容改变了!
这些数据的总和是:44
2内容改变了!
2
3
4
5
6
7
8
9
 参考:http://www.javaworld.com/javaworld/javaqa/2001-05/04-qa-0525-observer.html

 

0
2
分享到:
评论

相关推荐

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

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

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

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    C#设计模式-吕震宇

    设计模式(19)-Observer Pattern 设计模式(18)-Command Pattern 设计模式(17)-Chain of Responsibility Pattern 设计模式(16)-Bridge Pattern 设计模式(15)-Facade Pattern 设计模式(14)-Flyweight...

    Observer设计模式实例

    Observer设计模式,也被称为“发布-订阅”(Publish-Subscribe)模式或“依赖倒置”模式,是软件设计中的一种行为模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...

    设计模式培训-observer

    #### Observer模式简介与应用场景 观察者模式(Observer Pattern),又称为发布-订阅模式,是一种行为设计模式,用于定义对象之间的依赖关系,其中一个对象(主题)的状态变化会自动通知其所有依赖对象(观察者)。...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)_《0528》.rar

    《设计模式--基于C#的工程化实现及扩展》是一本深入探讨软件设计模式的书籍,作者王翔通过C#语言来阐述各种设计模式的工程化应用和拓展。设计模式是软件开发中的一种最佳实践,它总结了在特定场景下解决常见问题的...

    JAVA设计模式-chm版

    这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的解决方案的标准化描述,它们在软件工程中起到了重要的作用,帮助开发者创建可维护、可扩展且易于理解...

    重温Observer模式--热水器·改

    在这个“重温Observer模式--热水器·改”的讨论中,作者将再次阐述如何不依赖C#的委托和事件来实现Observer模式,而是采用GOF(GoF,Gang of Four)的经典方式。 在Observer模式中,有两个核心角色:Subject(主题...

    26种设计模式-----pdf

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件名为"26种设计模式",其中可能详细介绍了软件开发中的26个核心设计模式。这些模式是经过时间检验、被广泛接受并反复使用...

    设计模式-王翔 全本

    《设计模式-王翔 全本》是一本深入探讨软件设计模式的重要著作,作者王翔在书中详尽地阐述了设计模式的理论基础与实践应用。设计模式是软件工程中的重要概念,它代表了在特定情境下,经过时间检验、可复用的解决方案...

    设计模式培训-observer.pdf

    在众多设计模式中,观察者模式(Observer Pattern)是一种行为型设计模式,它允许一个对象在状态发生改变时通知多个依赖对象,从而实现对象间的解耦。本篇将深入探讨观察者模式的核心概念、实现原理及应用案例,旨在...

    C#设计模式-C#设计模式

    在软件开发领域,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。C#设计模式是将这些通用解决方案应用于C#编程语言的具体实践。本文将深入探讨C#中的几种重要设计模式,并阐述它们的核心概念、...

    c++设计模式-行为型模式-观察者模式

    c++设计模式-行为型模式-观察者模式;qt工程;c++简单源码; 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式...

    23种 设计模式---面向对象的基本原则

    设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,为软件开发提供了可复用的解决方案。在面向对象编程中,设计模式基于一些基本原则,这些原则构成了良好设计的基础。本篇将深入探讨23种设计...

    Java 中的设计模式 - jdon

    《Java中的设计模式 - jdon》是一本深入探讨Java编程中设计模式的电子书,它主要聚焦于如何在实际开发中应用和理解这些经典的设计原则和模式。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决常见...

    设计模式-可复用面向对象软件的基础

    《设计模式-可复用面向对象软件的基础》这本书是面向对象编程领域中的一部经典之作。设计模式,作为软件工程中的重要概念,是解决常见问题的成熟解决方案的模板,它在实践中被反复验证并广泛接受。这本书深入浅出地...

Global site tag (gtag.js) - Google Analytics