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(观察者)模式
在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...
随机推荐
- 如何研究某个gene的ceRNA 网络
研究人员针对 PTEN 这个关键的抑癌基因,来探究调控该基因表达的ceRNA 网络: 分析策略: 1)预测能调控该基因的miRNAs 通过miRanda 软件预测和实验验证相结合的方式,挑选出 miR ...
- [转] 在图标库中,找到合适的图标 ico
作者:xlrocket链接:https://www.zhihu.com/question/19857245/answer/241696797 在图标库中,找到合适的图标 或许,一些小伙伴会有收集图标的 ...
- C/C++ 控制台演示彩色输出进度
#include <stdio.h> #include <windows.h> BOOL SetConsoleColor(WORD wAttributes); int main ...
- 移动端meta 解释
移动端meta 解释 <meta name="viewport" content="width=device-width, initial-scale=1.0, u ...
- PHPCMS v9设置文章的审核功能
对于新建的站点,如果想设置会员发布的文章必须通过审核后才能发布,则需要以下几步来完成: 1.根据需要自定义管理员角色或选择已有角色. 步骤:设置->管理员设置->角色管理->权限设置 ...
- WPF 跟踪命令和撤销命令(复原)
WPF 命令模型缺少一个特性是复原命令.尽管提供了一个 ApplicationCommands.Undo 命令,但是该命令通常被用于编辑控件(如 TextBox 控件),以维护它们自己的 Undo 历 ...
- ios开发之--判断奇偶数
==) {//如果是偶数 }else{//如果是奇数 } 记录下!
- $.post和jquerySubmit返回json数据获取的区别
$.post("/patrol/patrolDataContent!deleteContent.action",{"ids":ids},function(dat ...
- poj_2406 kmp
题目大意 给出一个字符串S,S可能是多个较短的字符串的重复连接.比如"ababab"为字符串"ab"重复三次的结果:"abc" 为" ...
- poj_1456 贪心
题目大意 一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该日期之前卖出可以获得收益,否则就无法卖出),且每种物品被卖出都有一个收益值Pi. 卖出每个物品需要耗时1天, ...