`
lvwenwen
  • 浏览: 958902 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

java设计模式之观察着模式(行为模式)

阅读更多

 

 (10).观察着模式Observer

文章链接:http://lykke.iteye.com/blog/1309952

是希望两个(或多个)对象,我们称之为Subject和Observer,当一方的状态发生改变的时候,

另一方能够得到通知。也就是说,作为Observer的一方,能够监视到Subject的某个特定的状态变化,

并为之做出反应。一个简单的例子就是:当一个用户视图中的数据被用户改变后,后端的数据库能够得到更新,

而当数据库被其他方式更新后,用户视图中的数据显示也会随之改变。

观察者模式实际上没什么高深的东西,就是运用了java的继承和接口,在被观察者的抽象类里设置一个状态标志,

通过该标志判断是否通知观察者对象。在学习该模式的同时,

我们更应该学习java的继承和接口的灵活应用,其实所有的设计模式都是继承、接口、多态的灵活应用



 

package com.createtype.desginpatterns.observer;

import java.util.Observable;

public class Book extends Observable {

	private String name = "";

	private double price = 0.0;

	public String getName() {

		return name;

	}

	public void setName(String name) {

		this.name = name;

	}

	public double getPrice() {

		return price;

	}

	public void setPrice(double price) {

		this.price = price;

	}

	// 当书的价格修改时调用该方法

	public void modifyPrice(Book b) {

		// 调用父类的方法,改变被观察者的状态

		setChanged();

		// 通知客户该书已降价

		notifyObservers(b);

	}

}


package com.createtype.desginpatterns.observer;

import java.util.Observable;

import java.util.Observer;

public class BuyerEmail implements Observer {

	private String buyerId = "";

	private String email = "";

	public String getBuyerId() {

		return buyerId;

	}

	public void setBuyerId(String buyerId) {

		this.buyerId = buyerId;

	}

	public String getEmail() {

		return email;

	}

	public void setEmail(String email) {

		this.email = email;

	}

	// 该方法会被“被观察者的父类”既Observable调用

	public void update(Observable o, Object arg) {

		// 这里做具体发电子邮件的操作

		Book b = (Book) arg;

		System.out.println("给顾客的发电子邮件:" + b.getName() + "降价了,目前价格为:"
				+ b.getPrice());

	}

}


package com.createtype.desginpatterns.observer;

import java.util.Observable;

import java.util.Observer;

public class BuyerMobileMessage implements Observer {

	private String buyerId = "";

	private String mobileNo = "";

	public String getBuyerId() {

		return buyerId;

	}

	public void setBuyerId(String buyerId) {

		this.buyerId = buyerId;

	}

	public String getMobileNo() {

		return mobileNo;

	}

	public void setMobileNo(String mobileNo) {

		this.mobileNo = mobileNo;

	}

	public void update(Observable o, Object arg) {

		// TODO Auto-generated method stub

		Book b = (Book) arg;

		System.out.println("给顾客的发手机短信:" + b.getName() + "降价了,目前价格为:"
				+ b.getPrice());

	}

}


package com.createtype.desginpatterns.observer;
/**
 * 输出: 
给顾客的发电子邮件:<<Java设计模式>>降价了,目前价格为:45.0 
给顾客的发手机短信:<<Java设计模式>>降价了,目前价格为:45.0 
不知道上面的例子你看懂了没有,观察者模式实际上没什么高深的东西,就是运用了java的继承和接口,
在被观察者的抽象类里设置一个状态标志,通过该标志判断是否通知观察者对象。
在学习该模式的同时,我们更应该学习java的继承和接口的灵活应用,其实所有的设计模式都是继承、接口、多态的灵活应用
 *  
 *
 */
public class MainApp {

	public static void main(String args[])

	{

		Book b1 = new Book();

		b1.setName("<<Java设计模式>>");

		b1.setPrice(45.00);// 假设原价是60,现在是降价促销

		// 下面的观察者在实际的应用中可以从数据库或文件中读取

		BuyerMobileMessage bm = new BuyerMobileMessage();

		bm.setBuyerId("001");

		bm.setMobileNo("13810500085");

		BuyerEmail be = new BuyerEmail();

		be.setBuyerId("001");

		be.setEmail("dobodo@163.com");

		// 增加观察者,在实际应用中就是那些人对该书做了关注

		b1.addObserver(bm);

		b1.addObserver(be);

		b1.modifyPrice(b1);

	}

}


package com.createtype.desginpatterns.observer;

import java.util.Observer;
import java.util.Vector;

public class Observable {

	private boolean changed = false;

	private Vector obs;

	// 创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。

	public Observable() {

		obs = new Vector();

	}

	/**
	 * 
	 * 添加观察者到观察者列表中去
	 */
	public synchronized void addObserver(Observer o) {

		if (o == null)

			throw new NullPointerException();

		if (!obs.contains(o)) {

			obs.addElement(o);

		}

	}

	/**
	 * 
	 * 删除一个观察者
	 */
	public synchronized void deleteObserver(Observer o) {

		obs.removeElement(o);

	}

	public void notifyObservers() {

		notifyObservers(null);

	}

	/**
	 * 通知操作,即被观察者发生变化,通知对应的观察者进行事先设定的操作,这个方法接受一个参数,这个参数一直传到观察者里,以供观察者使用
	 */

	public void notifyObservers(Object arg) {
		Object[] arrLocal;
		synchronized (this) {
			if (!changed)
				return;
			arrLocal = obs.toArray();
			clearChanged();
		}
		for (int i = arrLocal.length - 1; i >= 0; i--){
			//((Observer) arrLocal[i]).update(this, arg);
		}
	}

	public synchronized void deleteObservers() {
		obs.removeAllElements();
	}

	protected synchronized void setChanged() {
		changed = true;
	}

	protected synchronized void clearChanged() {
		changed = false;
	}

	public synchronized boolean hasChanged() {
		return changed;
	}

	public synchronized int countObservers() {
		return obs.size();
	}
}


package com.createtype.desginpatterns.observer;

public interface Observer {

	void update(Observable o, Object arg);

}
分享到:
评论

相关推荐

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    java设计模式之观察者模式

    Java设计模式是软件开发中的重要概念,它们是解决常见编程问题的经验总结,使得代码更加可复用、可扩展和易于维护。观察者模式(Observer Pattern)是这些模式中的一种,它在多对一的关系中使用,当一个对象的状态...

    JAVA设计模式(java设计)

    Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

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

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

    java 设计模式试题

    题目中的第一个选项“同一问题的不同表现形式”(A) 描述了设计模式的主要应用场景之一。设计模式帮助开发者处理常见的软件设计难题,确保代码的可读性、可维护性和可扩展性。 ### 2. 面向对象的基本原则 面向对象...

    重学java的设计模式

    本文将着重探讨创建型模式、结构型模式和行为模式这三大类设计模式,并结合六项设计原则进行深入解析。 首先,我们来看创建型模式。创建型模式关注于对象的创建,它们提供了创建对象的灵活方式,使得代码更具复用性...

    23种java设计模式.pdf

    JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建模式是指在创建对象时使用的模式,包括 Factory(工厂模式)、Singleton(单例模式)、Builder(建造者模式)、Prototype(原型模式...

    java版本的设计模式的实现demo

    在Java编程中,运用合适的设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是关于Java版本设计模式实现demo的一些补充说明: 1. 设计模式分类 设计模式通常分为三大类:创建型模式、结构型模式和行为型模式...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    《Java设计模式》是刘伟老师撰写的经典教材,它为Java程序员深入理解和应用设计模式提供了极佳的学习资源。设计模式作为软件工程中解决特定问题的典型方案,是每一个有志于成为高级开发者的程序员不可或缺的知识储备...

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

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

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...

    java 设计模式 观察者模式 简单实例 包括测试test类

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

    Java设计模式相关书籍

    以下是对标题"Java设计模式相关书籍"及描述"设计模式之禅 深入浅出"中所包含的关键知识点的详细阐述。 1. **设计模式的分类** 设计模式通常分为三大类:创建型模式(Creational Patterns)、结构型模式...

    java设计模式的应用

    ### Java设计模式的应用 #### 一、引言 在当今快速发展的软件开发领域,Java作为一门功能强大且灵活的语言,不仅拥有丰富的API资源,还能与强大的数据库系统无缝对接。这使得许多开发人员能够以模块化的形式构建...

    Java设计模式刘伟书本中模拟考试答案

    在《Java设计模式》这本书的模拟试题及其参考答案中,涉及了多条设计模式的知识点,以及它们的应用场景和实现方法。现在将这些知识点详细地解释如下: 1. 开闭原则(Open-Closed Principle, OCP): 开闭原则是面向...

Global site tag (gtag.js) - Google Analytics