观察者模式:

    试想,在电子商务网站上,一个用户看中了一件一份,但是当时衣服的价格太贵,你需要将衣服收藏,以便等衣服降价时自动通知该用户。这里就是典型的观察模式的例子。

    1.观察者模式的定义:

       定义了一种对象之间的依赖关系,当一个对象(主题)发生改变时,它所有的依赖者(观察者)会收到主题状态改变的通知,并更新自己的状态。

观察者模式让主题和观察者松耦合。主题不知道观察者的实现细节;任何时候在增加观察者的时候,可以随时增加,而不需要改变主题的代码,当然删除观察者也是一样。在开始的例子中,衣服便是主题(Subject),用户便是观察者(Observer),用户将衣服加收藏的过程便是观察者在主题注册那里的过程。

2.观察者模式的类图:

3.java提供了内置的观察者模式:Observer接口和Observerable类;为了理解观察模式,先不用这个内置方法,先用常规的方法实现以下上述例子:

package observer;
//主题接口
public interface Subject { public void addObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyObserver();
}
package observer;

//观察者接口
public interface Observer { public double getOldPrice();
public void update(double price);
}
package observer;
/*
* 具体的主题,concrete subject
*/
import java.util.ArrayList;
import java.util.List;
public class ClotheSubject implements Subject{ List<Observer> observers ;
double price;
public ClotheSubject()
{
observers = new ArrayList<>();
}
@Override
public void addObserver(Observer observer) {
// TODO Auto-generated method stub
observers.add(observer);
} @Override
public void deleteObserver(Observer observer) {
// TODO Auto-generated method stub
int index = (int)observers.indexOf(observer);
if(index >= 0)
observers.remove(index);
} @Override
public void notifyObserver() {
// TODO Auto-generated method stub
for(int i = 0;i < observers.size();i++)
{
Observer observer = (Observer)observers.get(i);
observer.update(price);
}
} public void setPrice(double price)
{
this.price = price;
notifyObserver();
} }
package observer;

public class ClotheObserver implements Observer{

	Subject subject;
double price = 100.00d;//原始价格
public ClotheObserver(Subject subject)
{
this.subject = subject;
subject.addObserver(this);
}
@Override
public void update(double price) {
// TODO Auto-generated method stub
if(price<this.getOldPrice())
System.out.println("您上次看中衣服的价格变为:"+price+",请抓紧购买!");
this.price = price;
}
@Override
public double getOldPrice() {
// TODO Auto-generated method stub
return price;
} }

测试代码:

package observer;

public class Client_test {

	public static void main(String args[])
{
ClotheSubject clothe_subject = new ClotheSubject();
Observer clothe_observer = new ClotheObserver(clothe_subject);
clothe_subject.setPrice(10.00d);
clothe_subject.setPrice(90.00d);
clothe_subject.setPrice(20.00d);
}
}

4.java自身提供的内置观察者模式:java.util提供了observer接口和Observerable类,对象只需要实现观察者接口,便可以成为观察者,然后调用Observerable的addObserver方法,便加入主题中。下面是用内置观察者模式重新修改上例代码:

主题类:

package observer;
/*
* 具体的主题,concrete subject
*/
import java.util.Observable;
public class ClotheSubject extends Observable{ double price;
public ClotheSubject()
{
}
public void priceChanged()
{
setChanged();
notifyObservers();//Observable中的方法,会调用观察者的update方法
} public void setPrice(double price)
{
this.price = price;
priceChanged();
} public double getPrice()
{
return price;
}
}

观察者类:

package observer;
import java.util.Observable;
import java.util.Observer;
public class ClotheObserver implements Observer{ Observable observerable;
double price = 100.00d;
public ClotheObserver(Observable observerable)
{
this.observerable = observerable;
//将自己注册为观察者
observerable.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if(o instanceof ClotheSubject)
{
ClotheSubject clothesubject = (ClotheSubject)o;
if(price > clothesubject.getPrice())
display(clothesubject.getPrice());
this.price = clothesubject.getPrice();
}
} public void display(double price)
{
System.out.println("您上次看中衣服的价格变为:"+price+",请抓紧购买!");
} }

测试代码:

package observer;

public class Client_test {

	public static void main(String args[])
{
ClotheSubject clothe_subject = new ClotheSubject();
ClotheObserver clothe_observer = new ClotheObserver(clothe_subject);
clothe_subject.setPrice(90.00d);
clothe_subject.setPrice(80.00d);
}
}

java观察者(Observer)模式的更多相关文章

  1. Java 实现观察者(Observer)模式

    1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...

  2. Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式

    观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...

  3. 观察者(Observer)模式

    观察者模式又叫做发布-订阅模式(Publish.Subscribe)模式.模型-视图模式(Model/View)模式.源-监听器模式(Source/Listener)模式或从属者(Dependents ...

  4. 设计模式C++描述----04.观察者(Observer)模式

    一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...

  5. 面向对象设计模式——观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  6. 设计模式之观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  7. Head First 设计模式 —— 02. 观察者 (Observer) 模式

    思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...

  8. 《Head First 设计模式》ch.2 观察者(Observer)模式

    观察者模式 定义了对象之间一对多以来,这样一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新 设计原则-松耦合 松耦合将对象之间的互相依赖降到了最低——只要他们之间的接口仍被遵守 观察者 ...

  9. Java设计模式——Observer(观察者)模式

    在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...

随机推荐

  1. Wex5短信验证

    调了好几天短信验证测试,终于成功,现将全部源代码发给大家,希望对各位有所帮助,少走弯路        Model.prototype.saveUserBtnClick = function(event ...

  2. Visual Studio使用技巧,创建自己的代码片段

    1.代码片段的使用示例 在编写代码中常会使用代码片段来提高我们的编写代码的效率,如:在Visual Studio中编写一个 for(int i = 0; i < length;i++) { } ...

  3. Cocos2d-x 3.0 Lua编程 之 响应Android手机的按键

    演示样例代码例如以下所看到的: local listenerKey= cc.EventListenerKeyboard:create() local function onKeyReleaseed(k ...

  4. mybatis由浅入深day02_7查询缓存_7.2一级缓存_一级缓存应用

    7 查询缓存 7.1 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时 ...

  5. Java精选笔记_JDBC

    JDBC 概述 什么是JDBC JDBC全称是Java数据库连接(Java Database Connectivity),应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据 ...

  6. 浏览器Chrome对WebGL支持判断

    1.开启方式: 第一种:打开cmd,切换到Chorme的安装目录,敲入chrome.exe --enable -webgl,回车就会打开一个chrome浏览器窗口: 第二种:找到Chrome浏览器的快 ...

  7. DAGDGC特殊调弦

    DAGDGC 特殊调弦 重要知识点: 1)音高从高到低排序为:BAGFEDC 2)吉他标准音是(1到6弦) EBGDAE 3)吉他同一弦,每相差一个品级,相差是半个音 调弦方法:1)第一弦(E-> ...

  8. glob模块--查询一个文件名列表

    ''' 在python中,glob模块是用来查找匹配的文件的 在查找的条件中,需要用到Unix shell中的匹配规则: * : 匹配所所有 ? : 匹配一个字符 *.* : 匹配如:[hello.t ...

  9. LVS+keeplived+nginx+tomcat高可用、高性能jsp集群

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://kerry.blog.51cto.com/172631/557749 #!/bin ...

  10. cocos2dx-3.x物理引擎Box2D介绍

    理引擎 Cocos2d-x引擎内置了两种物理引擎,它们分别是Box2D和Chipmunk,都是非常优秀的2D物理引擎,而且x引擎将它们都内置在SDK中.Box2D使用较为广泛,在这里选择Box2D来进 ...