观察者模式java_设计模式之观察者模式(Java)

观察者模型实例之烧开水

从一个烧开水的例子出发。现在我们有个热水器,我们用它来烧开水。在烧水的过程中,显示器和扬声器都一直监视水温。显示器将水温显示在显示屏上。另外,当水温超过90度时,扬声器开始发出警告,提示水快烧开。

Java实现

Java对观察者类的支持,主要体现在Observable类和Observer接口。

1. java.util.Observable类 = 被观察者

Observable类的主要方法:

public classObservable {void setChanged(); //设置被观察者的状态已经被改变

void clearChanged(); //清除被观察者状态的改变,此时再调用hasChanged()将返回false

voidaddObserver(Observer observer);intcountObservers();voiddeleteObserver(Observer observer);voiddeleteObservers();booleanhasChanged();voidnotifyObservers();void notifyObservers(Object arg); //参数一般设定为被改变的属性

}

热水器类继承自Observerable类,作为一种具体的被监控对象:

public class Heater extendsObservable {private inttemperature;//get方法,返回水温

public intgetTemperature(){returntemperature;

}//set方法,设置水温

public void setTemperature(inttemperature){this.temperature =temperature;

}//boilWater方法,烧水

public voidboilWater(){for(int i = 30; i <= 100; i++){this.setTemperature(i);this.setChanged();this.notifyObservers(this.getTemperature());this.clearChanged();

}

}

}

2. java.util.Observer接口 = 观察者

Observer接口只有一个抽象方法需要被具体的观察者实现。

public interfaceObserver{void update(Observable observable, Object arg); //这里的arg即Obserbale类里的notifyObservers(Object arg)传过来的参数

}

Note:当被观察者调用nofityObservers(*)方法时,会根据被观察者的hasChanged()方法来判断它的状态是否被改变。如果改变,则观察者调用update方法。否则不调用(即不更新)。

显示器和扬声器作为具体的热水器水温监视者,都需要实现Observer接口。对于显示器,它的update方法作用就是更新显示的水温。对扬声器,它的update方法则是在水温超过90度时发出警告。具体代码如下:

//显示器

public class Displayer implementsObserver {public voidupdate(Observable observable, Object arg){

display((int)arg);

}public void display(inttemperature){

System.out.println("Current Temperature is: " + temperature + " degree.");

}

}//扬声器

public class Alertor implementsObserver {public voidupdate(Observable observable, Object arg){int temperature = (int) arg;if(temperature > 90){

alarm();

}

}public voidalarm(){

System.out.println("Warning: Temperature is over 90 degree!");

}

}

3. 测试类

public classTestObserver{public static voidmain(String[] args){//生成设备

Heater heater = newHeater();

Displayer displayer= newDisplayer();

Alertor alertor= newAlertor();//添加订阅 - 重点(!!!)

heater.addObserver(display);

heater.addObserver(alertor);//烧水

heater.boilWater();

}

}

4. 将上面的3个步骤统一起来,写到一个文件中如下:文件名TestObserver.java

importjava.util.Observable;importjava.util.Observer;public classTestObserver {public static voidmain(String[] args){//生成设备

Heater heater = newHeater();

Displayer displayer= newDisplayer();

Alertor alertor= newAlertor();//添加订阅

heater.addObserver(displayer);

heater.addObserver(alertor);//烧水

heater.boilWater();

}

}class Heater extendsObservable {private inttemperature;//get方法,返回水温

public intgetTemperature(){returntemperature;

}//set方法,设置水温

public void setTemperature(inttemperature){this.temperature =temperature;

}//boilWater方法,烧水

public voidboilWater(){for(int i = 30; i <= 100; i++){this.setTemperature(i);this.setChanged();this.notifyObservers(this.getTemperature()); //只需传入监视器感兴趣的变量

this.clearChanged();

}

}

}//显示器

class Displayer implementsObserver {public voidupdate(Observable observable, Object arg){

display((int)arg);

}public void display(inttemperature){

System.out.println("Displayer: Current Temperature is: " + temperature + " degree.");

}

}//扬声器

class Alertor implementsObserver {public voidupdate(Observable observable, Object arg){int temperature = (int) arg;if(temperature > 90){

alarm();

}

}public voidalarm(){

System.out.println("Alertor: Warning: Temperature is over 90 degree!");

}

}

最后的输出结果为:

Displayer: Current Temperature is: 30degree.

Displayer: Current Temperature is:31degree.

Displayer: Current Temperature is:32degree.

...

Displayer: Current Temperature is:90degree.

Displayer: Current Temperature is:91degree.

Alertor: Warning: Temperature is over90 degree!Displayer: Current Temperature is:92degree.

Alertor: Warning: Temperature is over90 degree!...

Displayer: Current Temperature is:99degree.

Alertor: Warning: Temperature is over90 degree!Displayer: Current Temperature is:100degree.

Alertor: Warning: Temperature is over90 degree!

总结

第一次写技术博客感觉比较费劲。原以为一个下午能把三种实现方法都写完的,结果只写完了Java部分。后续的Objective-C 和C#部分计划明天下午搞定。敬请期待。

欢迎交流和讨论^_^ ~ 如有任何问题,请发送到邮箱:fengfu0527@gmail.com

[1]. 《Design Patterns: Elements of Reusable Object-Oriented Software》

[2]. Java之美之设计模式,链接:http://bolg.csdn.net/zhangerqing/article/details/8194653

[3]. 《Java与模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值