设计模式之观察者模型Observer

package ObserverModel;

/**
* 观察者模式意图是:定义对象间的一种一对多的依赖关系,当一个对象的状态发生
* 改变时,所有依赖它的对象都得到通知并被自动更新。
*
* 以股票为例:股民设置了一只股票,如果股票升到某个价位,系统会自动给股民发
* 一个警告的短信。这就需要在股票stock中加入一个Observer角色,以便stock
* 细节发生变化时,observer能自动观察到这个变化,并及时update和nofity动作。
*
* 在java的核心库中,已经实现了observer模式,直接引用就可以了。基本步骤如下:
* 1,扩展java.util.Observerable,设置要监控的字段,如股票的价格等等。
* 2,实现java.util.Observer接口,实现处理事件,如通知股民,发送短信等等。
*
* 以下AbleImp抽象类继承自Observable类,被观察对象,需继承此父类,
* 进行事件的扩展监控。
*/
import java.util.Observable;

public abstract class AbleImp extends Observable{

private boolean clearFlag = false;

/**
* 监控一个属性对象
* @param obj属性对象,也就是要观察的对象
*/
public void observeOneObject(Object obj){
this.setChanged();
this.notifyObservers(obj);
}

/**
* 增加一个观察者
* @param oimp--观察者
*/
public void addOneObserver(StockAlert oimp){
this.addObserver(oimp);
}

/**
* 删除一个受控对象
* @param oimp --观察者
*/
public void removeOneObserver(StockAlert oimp){
this.deleteObserver(oimp);
}

/**
* 取消所有监控,在取消之前触发受控消息
*/
public void cancelAllObservers(){
this.notifyObservers();
this.clearChanged();
this.deleteObservers();
clearFlag = true;
}

public void finalize()throws Throwable{
if(clearFlag == false){
this.clearChanged();
this.deleteObservers();
}
}


}

==================================================================
package ObserverModel;

import java.util.Observable;
import java.util.Observer;
//观察者需要
public class StockAlert implements Observer{

/**
* arg 就是监控的字段,如股票的价格
*/
@Override
public void update(Observable o, Object arg) {
//处理报警事件
Stock stock = (Stock)o;
System.out.println(arg.toString()+" this stock price is:"+stock.getPrice());
System.out.println("send a message to customer。。。");

}


}
===========================================================
package ObserverModel;
//被监控的对象股票
public class Stock extends AbleImp{

private Float price;

//监控事件,自己扩展
public void setPrice(Float price,Float targetPrice){
this.price = price;
//设置报警条件
if(this.price.floatValue() >= targetPrice.floatValue()){
this.observeOneObject(this.price);//设置报警对象
}
}

public Float getPrice() {
return price;
}

public void setPrice(Float price) {
this.price = price;
}

}
===================================================================
package ObserverModel;

public class TestStock {
/**
* 1.对股票增加观察者
* 2.设置监控对象,比如要监控股票的价格。
* @param args
*/
public static void main(String args[]){
StockAlert alert = new StockAlert();
Stock stock = new Stock();
stock.addOneObserver(alert);//增加一个观察者
// stock.deleteObserver(alert);
stock.setPrice(new Float(12.5), new Float(13.5)); //股票正常
System.out.println("-----------");
stock.setPrice(new Float(18.5), new Float(13.5)); //股票异常
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值