`
xgcai
  • 浏览: 8191 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

设计模式--观察者模式“拉”数据

 
阅读更多

 

  • 前面讲了观察者模式的“推”数据的方式,接下来时观察者模式的“拉”数据方式。

拉数据方式是指具体主题不将变化后的数据交给具体观察者,而是提供获得这些数据的方法,具体主题在得到通知后,调用具体主题的方法更新自己的数据(即观察者把数据拉过来)。

 

例子,一家商店发布打折商品信息,包括商品的价格、折后价、名称。有两位顾客,一位关注打折的商品,另一位关心商品折后价格。

 

/**
 * 
 */
package org.rico.pattern.demo.observer2;

/**
 * @author rico 2013-3-3
 *  主题:定义具体主题需要实现的方法,如:添加、删除、通知观察者的方法。
 */
public interface Subject {
	
	/**
	 * 新增观察者
	 * @param observer
	 */
	public void add(Observer observer);
	
	/**
	 * 删除观察者
	 * @param observer
	 */
	public void delete(Observer observer);
	
	/**
	 * 主题通知观察者更新数据
	 */
	public void notifyObserver();
	
}

 

/**
 * 
 */
package org.rico.pattern.demo.observer2.impl;

import java.util.ArrayList;
import java.util.List;

import org.rico.pattern.demo.observer2.Observer;
import org.rico.pattern.demo.observer2.Subject;

/**
 * @author rico 2013-3-3
 * 
 */
public class ShopSubject implements Subject {
	private List<Observer> observers = null;
	private int oldPrice, newPrice;
	private String goodName;
	
	public ShopSubject() {
		observers = new ArrayList<Observer>();
	}

	/* (non-Javadoc)
	 * @see org.rico.pattern.demo.observer.Subject#add(org.rico.pattern.demo.observer.Observer)
	 */
	@Override
	public void add(Observer observer) {
		if(!observers.contains(observer)) {
			observers.add(observer);
		}
	}

	/* (non-Javadoc)
	 * @see org.rico.pattern.demo.observer.Subject#delete(org.rico.pattern.demo.observer.Observer)
	 */
	@Override
	public void delete(Observer observer) {
		if(observers.contains(observer)) {
			observers.remove(observer);
		}
	}

	/* (non-Javadoc)
	 * @see org.rico.pattern.demo.observer.Subject#notifyObserver()
	 */
	@Override
	public void notifyObserver() {
		for(Observer ob : observers) {
			ob.update();
		}
	}
	
	//设置商品信息
	public void setGoods(String goodName, int oldPrice, int newPrice) {
		this.setGoodName(goodName);
		this.setOldPrice(oldPrice);
		this.setNewPrice(newPrice);
		
		this.notifyObserver();
	}

	public List<Observer> getObservers() {
		return observers;
	}

	public void setObservers(List<Observer> observers) {
		this.observers = observers;
	}

	public int getOldPrice() {
		return oldPrice;
	}

	public void setOldPrice(int oldPrice) {
		this.oldPrice = oldPrice;
	}

	public int getNewPrice() {
		return newPrice;
	}

	public void setNewPrice(int newPrice) {
		this.newPrice = newPrice;
	}

	public String getGoodName() {
		return goodName;
	}

	public void setGoodName(String goodName) {
		this.goodName = goodName;
	}

}

 

/**
 * 
 */
package org.rico.pattern.demo.observer2;

/**
 * @author rico 2013-3-4
 * 观察者
 */
public interface Observer {
	public void update();
}

 

/**
 * 
 */
package org.rico.pattern.demo.observer2.impl;

import org.rico.pattern.demo.observer2.Observer;
import org.rico.pattern.demo.observer2.Subject;

/**
 * @author rico 2013-3-4
 * 顾客(具体观察者)
 */
public class CustomerOne implements Observer {
	private Subject subject;
	private String name;
	
	public CustomerOne(Subject subject, String name) {
		this.subject = subject;
		this.name = name;
		subject.add(this);
	}

	/* 顾客从商店“拉去”数据,更新自己的数据(non-Javadoc)
	 * @see org.rico.pattern.demo.observer2.Observer#update()
	 */
	@Override
	public void update() {
		if(subject instanceof ShopSubject) {
			ShopSubject su  = (ShopSubject) subject;
			System.out.println("顾客:" + name + ",");
			System.out.println("只对商品名称感兴趣,");
			System.out.println("商品名称:" + su.getGoodName());
		} else {
			System.out.println("获取到任何数据...");
		}
	}
}

 

/**
 * 
 */
package org.rico.pattern.demo.observer2.impl;

import org.rico.pattern.demo.observer2.Observer;
import org.rico.pattern.demo.observer2.Subject;

/**
 * @author rico 2013-3-4
 * 顾客(具体观察者)
 */
public class CustomerTwo implements Observer {
	private Subject subject;
	private String name;
	
	public CustomerTwo(Subject subject, String name) {
		this.subject = subject;
		this.name = name;
		subject.add(this);
	}

	/* 顾客从商店“拉去”数据,更新自己的数据(non-Javadoc)
	 * @see org.rico.pattern.demo.observer2.Observer#update()
	 */
	@Override
	public void update() {
		if(subject instanceof ShopSubject) {
			ShopSubject su  = (ShopSubject) subject;
			System.out.println("顾客:" + name + ",");
			System.out.println("只对商品价格感兴趣,");
			System.out.println("商品价格:" + su.getNewPrice() + "-" + su.getOldPrice());
		} else {
			System.out.println("获取到任何数据...");
		}
	}
}

 

/**
 * 
 */
package org.rico.pattern.demo.observer2;

import org.rico.pattern.demo.observer2.impl.CustomerOne;
import org.rico.pattern.demo.observer2.impl.CustomerTwo;
import org.rico.pattern.demo.observer2.impl.ShopSubject;

/**
 * @author rico 2013-3-3
 * 
 */
public class ObserverTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ShopSubject subject = new ShopSubject();
		Observer university = new CustomerOne(subject, "rico");
		Observer haigui = new CustomerTwo(subject, "admin");
		
		System.out.println("###################感冒999#######################");
		subject.setGoods("感冒999", 10, 8);
		
		System.out.println("###################可口可乐#######################");
		subject.setGoods("可口可乐", 6, 5);
		
	}
}

 

分享到:
评论

相关推荐

    体系结构学习代码!特别详细丰富

     【例6.19】事件体系结构-观察者模式-温度显示  【例6.21】层次架构-软件测试  【例6.22】层次架构-银行- Access数据库  【例6.23】MVC架构-二手车拍卖-无观察者  【例6.24】MVC架构-二手车拍卖-观察者-3...

    深入理解观察者模式-Java设计模式及应用案例(第2版)-[共5页].pdf

    12.3 深入理解观察者模式 (1)深入理解 ISubject、IObserver 接口 上文中的 Subject 类中的中心数据 data 是 String 类型的,因此 IObserver 接口中定义的 refresh() 方法参数类型也是 String 类型的。若 data 改...

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - 使用泛型实现Stack 生成斐波那契数列 使用容器 利用迭代器实现原材料 实用程序 StringUtil类 - 封装常用的...

    设计模式 观察者模式 以Android中TextView文本内容发生变化为背景

    这个代码主要以Android中的TextView发生变化,而凡是订阅了此类消息的实体类对象均能够打印出日志。例子很简单,起抛砖引玉,希望大家能够理解观察者模式在Android中的应用

    数据频繁挖掘案例(观察者模式)

    一个数据频繁模式挖掘的算法实现,采用java设计模式中的观察者模式。其中不仅包含java project运行文件,还包括总结的PPT(内部含有我画的类图与时序图)。

    请根据观察者模式,用Java语言设计并实现气象站程序。

    请根据观察者模式,用Java语言设计并实现气象站程序。其中,部分代码已经写好,包括: • 观察者接口 • 主题接口 • 显示板接口 • 测试程序 请在此框架下,继续完成CurrentConditionsDisplay、ForecastDisplay...

    33种JAVA设计模式DEMO

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计...

    用Java实现23种设计模式

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 ...

    观察者模式

    观察者模式 源代码 样例:李先生希望及时知道气象站所维护的每日天气数据,例如:最高气温和最低气温等,同时还希望及时知道旅行社每日的旅游信息。 采用观察者模式设计,其中李先生就是一个具体的观察者,而气象站...

    ActionScript 3.0设计模式扫描版_方红琴译

    观察者模式中关键的00P概念 观察者模式最小化示例 实例:添加状态并标识用户 动态地改变状态 实例:采用不同的形式显示数据 小结 第9章 模板方法模式 什么是模板方法模式7 模板方法用到的主要()OP概念 最小...

    C++设计模式之观察者模式

    这就要说到今天总结的观察者模式了,作为设计模式大家庭中最重要的一个,我们不得不去好好的学习一下观察者模式。 观察者模式 在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:定义对象...

    用C++ 实现设计模式之观察者模式

     而我们常见的mvc模式,v是指view-视图,m指model-模型,有点类似观察者模式,模型中的数据,一有变化通知相关联的视图. 这样很方便地隔离开了模型和视图.  这里使用的例子是关于博客的订阅. 博客属于被观察的...

    C#23种设计模式_示例源代码及PDF

    观察者模式: 让多个观察者对象同时监听某一个 观察者模式 观察者模式定义了一种一队多的依赖关系, 主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更 新自己。 20、STATE —...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    观察者12.1 何为观察者模式12.2 何时使用观察者模式12.3 在模型-视图-控制器中使用观察者模式12.4 在Cocoa Touch框架中使用观察者模式12.4.1 通知12.4.2 键-值观察12.5 在TouchPainter中更新CanvasView上的线条12.6 ...

    深入浅出设计模式(中文版)

    5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...

    java设计模式选择题复习题.doc

    工厂模式定义一个创建对象的接口,让子类决定实例化哪一个类 5观察者模式的推拉有什么不同?适用场景 现在要说的分歧在这里: "推"的方式是指,Subject维护一份观察者的列表,每当有更新发生,Subject会把更新 消息...

    23种设计模式入门到精通详解.txt

    观察者模式:对象间的一对多的依赖关系。 备忘录模式:在不破坏封装的前提下,保持对象的内部状态。 中介者模式:用一个中介对象来封装一系列的对象交互。 命令模式:将命令请求封装为一个对象,使得可以用不同的...

    深入浅出设计模式(中文版电子版)

    5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...

    android 网络应用轻量框架-多线程管理-高效缓存-设计模式

    6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统...

Global site tag (gtag.js) - Google Analytics