java 观察者模式


package mvc;

import java.util.Observable;

/*
 * 一个 observable 对象可以有一个或多个观察者。观察者是实现Observer接口的任意对象
 * 一个 observable 实例改变后,调用 Observable 的 notifyObservers 
 * 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变
 * 该实例模拟了烧水的过程,涉及三个对象,Heater(热水器),Display(显示器),Alarm(报警器).
 * 模拟过程:为了便于运行,水的初始化温度为90,沸点为95,
 * 显示器依据热水器显示温度,显示器显示温度为95时,报警器开始报警。明显可以看出Heater是subject ,
 * Display 是它的 Obsrver,同时Display亦是subject,因为它要被报警器观察,所以Alarm是Display的Observer.
*/



public class Heater extends Observable {
    private int temperature;
    public int getTemperature() {
       return temperature;
    }
    public void setTemperature(int temperature) {
       this.temperature = temperature;
    }
    public void boilWater() {
       for (int i = 90; i < 110; i++) {
           temperature = i;
       this.setChanged();
       this.notifyObservers();
       }
    }

}


package mvc;


import java.util.Observable;
import java.util.Observer;


public class Display extends Observable implements Observer {
    private String status = "未开";
    public String getStatus() {
       return status;
    }
    public void setStatus(String status) {
       this.status = status;
    }
    @Override
    public void update(Observable o, Object arg) {


       this.displayTemperature(((Heater) o).getTemperature());
    }
    private void displayTemperature(int temperature) {


       if (temperature >= 100) {


           this.setStatus("沸腾");


           this.setChanged();


           this.notifyObservers(temperature);


       }


       System.out.println("状态: " + status + "  现在温度: " + temperature);


    }


}




package mvc;


import java.util.Observable;
import java.util.Observer;


public class Alarm implements Observer {
  
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
this.makeAlarm((Integer) arg);
}
    private void makeAlarm(int temperature) {
    if(temperature==100){
    System.out.println("嘀嘀嘀。。。水已经烧开了");
    }
       //System.out.println("嘀嘀嘀。。。水已经烧开了");
       // System.out.println("现在水温是: " + temperature);
    }

}



package mvc;
public class TestMain {


    public static void main(String[] args) {


       Heater heater = new Heater();


       Display display = new Display();


       Alarm alarm = new Alarm();
       heater.addObserver(display);
       display.addObserver(alarm);
       heater.boilWater();
    }
}



效果

状态: 未开  现在温度: 90
状态: 未开  现在温度: 91
状态: 未开  现在温度: 92
状态: 未开  现在温度: 93
状态: 未开  现在温度: 94
状态: 未开  现在温度: 95
状态: 未开  现在温度: 96
状态: 未开  现在温度: 97
状态: 未开  现在温度: 98
状态: 未开  现在温度: 99
嘀嘀嘀。。。水已经烧开了
状态: 沸腾  现在温度: 100
状态: 沸腾  现在温度: 101
状态: 沸腾  现在温度: 102
状态: 沸腾  现在温度: 103
状态: 沸腾  现在温度: 104
状态: 沸腾  现在温度: 105
状态: 沸腾  现在温度: 106
状态: 沸腾  现在温度: 107
状态: 沸腾  现在温度: 108
状态: 沸腾  现在温度: 109


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值