Java基础类库之Observable(观察者模式)
说明在 Java 程序中,类 Observable 和接口 Observer 的最大功能就是实现观察者模式。举个例子例如现在房地产调控比较严格,很多购房者都在关注着房子的价格变化,每当房子价格变化时,所有的购房者都可以观察得到。实际上以上的购房者都属于观察者,他们都在关注着房子的价格。这个观察变化的过程就可以成为观察者模式。如果实现观察模式在 Java 中可以直接依靠类 Observab...
·
说明
在 Java 程序中,类 Observable 和接口 Observer 的最大功能就是实现观察者模式。
举个例子
例如现在房地产调控比较严格,很多购房者都在关注着房子的价格变化,每当房子价格变化时,所有的购房者都可以观察得到。实际上以上的购房者都属于观察者,他们都在关注着房子的价格。这个观察变化的过程就可以成为观察者模式。
如果实现观察模式
在 Java 中可以直接依靠类 Observable 和 接口 Observer实现以上观察者模式的功能。在Java 应用中,需要被观察的类必须继承于 Observable 类。每个观察者类都需要实现 Observer 接口,其定义如下:
public interface Observer{
// 第一个参数表示被观察者实例,第二参数表示修改的内容
void update(Observable o, Object arg)
}
代码实例
import java.util.Observable;
import java.util.Observer;
// 继承 Observable 表示房子可以被观察
class House extends Observable{
private float price; // 加钱
public House(float price) {
this.setPrice(price);
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
// 每一次修改的时候都引起观察者的注意
super.setChanged(); // 设置变化点
super.notifyObservers(price); // 价格被改变
this.price = price;
}
public String toString() {
return "房价为:"+this.price;
}
}
// 设置房子的具体观察者
class HousePriceObserver implements Observer{
private String name;
public HousePriceObserver(String name) {
// 设置每一个观察的名字
this.name = name;
}
/**
* 当变化之后,就会自动触发该方法
*/
@Override
public void update(Observable o, Object arg) {
if(arg instanceof Float){
System.out.println(this.name+" 观察到价格更改为:" + arg);
}
}
}
public class TestObserve {
public static void main(String[] args) {
// 创建可观察对象
House h = new House(100000);
// 创建购房者
HousePriceObserver hpo1 = new HousePriceObserver("购房者 A");
HousePriceObserver hpo2 = new HousePriceObserver("购房者 B");
HousePriceObserver hpo3 = new HousePriceObserver("购房者 C");
// 添加可观察对象
h.addObserver(hpo1);
h.addObserver(hpo2);
h.addObserver(hpo3);
System.out.println(h); // 输出房子的价格
h.setPrice(600000); // 修改房子价格
System.out.println(h); // 输出房子的价格
}
}
控制台输出
房价为:100000.0
购房者 C 观察到价格更改为:600000.0
购房者 B 观察到价格更改为:600000.0
购房者 A 观察到价格更改为:600000.0
房价为:600000.0
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献5条内容
所有评论(0)