java观察者(Observer)模式
观察者模式:
试想,在电子商务网站上,一个用户看中了一件一份,但是当时衣服的价格太贵,你需要将衣服收藏,以便等衣服降价时自动通知该用户。这里就是典型的观察模式的例子。
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)模式的更多相关文章
- Java 实现观察者(Observer)模式
1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...
- Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式
观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...
- 观察者(Observer)模式
观察者模式又叫做发布-订阅模式(Publish.Subscribe)模式.模型-视图模式(Model/View)模式.源-监听器模式(Source/Listener)模式或从属者(Dependents ...
- 设计模式C++描述----04.观察者(Observer)模式
一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- 设计模式之观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- Head First 设计模式 —— 02. 观察者 (Observer) 模式
思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...
- 《Head First 设计模式》ch.2 观察者(Observer)模式
观察者模式 定义了对象之间一对多以来,这样一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新 设计原则-松耦合 松耦合将对象之间的互相依赖降到了最低——只要他们之间的接口仍被遵守 观察者 ...
- Java设计模式——Observer(观察者)模式
在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...
随机推荐
- Ubuntu下,如何解决Unable to locate package
在虚拟机上新装了一个ubuntu 12.10,想在上面装一个Git,却发生了以下错误信息 我觉得原因可能是我换了163的源,没有更新所以找不到这个包. 这时候就要使用 sudo apt-get upd ...
- html dom基本操作
//div出滚动条: <div id="discussion" style="height:500px;overflow:auto;"></d ...
- storm深入研究
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:He Ransom链接:http://www.zhihu.com/question/23441639/answer/28075 ...
- Golang 语言安装
Ubuntu: 从源代码编译安装 安装gcc工具,因为golang有些功能是使用c写的,所以构建golang的编译是必须的 apt-get install bison gawk gcc libc6-d ...
- Spring MVC异常统一处理
package com.shzq.common.exception; import java.io.PrintWriter;import java.io.StringWriter;import jav ...
- Jmeter content-type:multipart/form-data温故
本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及到的content-type 有三种: content-type:在Request Headers里, ...
- swift--获取window
有时候,我们需要频繁的调用界面,然后给当前页面加一个跟视图,这个时候就需要找windown, 代码如下: let rootVC = UIApplication.shared.delegate as! ...
- Qt监控Arduino开关状态(读取串口数据)
setup.ini配置文件内容 [General] #游戏所在主机IP GameIp1=192.168.1.151 GameIp2=192.168.1.152 GameIp3=192.168.1.15 ...
- m2014-android->安卓开发在线案例
1.www.javaapk.com account: 克里斯 pwd: xiaobai 这个网站非常不错,各种例子,各种可供下载演示的项目,用了就知道,好处不多说,真心赞!
- ARM承认芯片漏洞:披露修复细节
在谷歌安全研究人员曝光了影响整个芯片产业的CPU设计漏洞后,ARM的Cortex系列处理器也未能逃过一劫.在一篇致开发者的博客文章中,该公司披露了三个已知漏洞的细节——其中两个与Spectre有关.第 ...