观察者模式:

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

    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. 初次使用ets

    一.new(Name, Options) -> tid() | atom(),创建ets表. Options = [Option], 目测常用的属性, {keypos, Pos}:指定key的位 ...

  2. par函数cex参数-控制文字和点的大小

    cex参数用来控制图片中点和文字的大小,对于一副图片来说,有很多的文字部分,包括x轴标签(xlab), y轴标签(ylab), x轴刻度上的文字, y轴刻度上的文字,主标题(main), 副标题(su ...

  3. kaptcha图形验证码组件

    kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.K ...

  4. Json学习一(基础概念知识学习)

    1.Json简单介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它使得人们非常easy的进行阅读和编写. 同一时候也方便了机器进行解析和生成.它是基 ...

  5. Unity 如何高效的解析数据

    昨天和朋友聊天时,他遇到这么一个问题:现在有按照一定格式的数据,例如:#code==text 此处是注释100==确定101==取消key==value 这么个格式的,说白了就是怎样解析这些固定格式字 ...

  6. Docker 集群管理

    docker systemd unit file [Unit] Description=Docker Application Container Engine Documentation=http:/ ...

  7. System.Func<>与System.Action<>

    使用并行编程可以同时操作多个委托,在介绍并行编程前先简单介绍一下两个泛型委托System.Func<>与System.Action<>. Func<>是一个能接受多 ...

  8. Linux,unix,cygwin,centeros下的tar压缩解压缩命令具体解释

    tar Examples:   tar -cf archive.tar foo bar  # Create archive.tar from files foo and bar.   tar -tvf ...

  9. hdu 5038 水题 可是题意坑

    http://acm.hdu.edu.cn/showproblem.php?pid=5038 就是求个众数  这个范围小 所以一个数组存是否存在的状态即可了 可是这句话真恶心  If not all ...

  10. Extjs学习笔记--(二)

    1.配置实用Extjs <link href="Extjs/resources/css/ext-all.css" rel="stylesheet" /&g ...