设计模式之观察者模式

什么叫观察者

在解释观察者设计模式的概念之前,读者先来看一个简单的例子:现在很多的购房者都在关注着房子的价格变化,每当房子价格变化时,所有的购房者都可以观察得到,实际上以上的购房者都属于观察者,他们都在关注着房子的价格。实际上这就叫观察者设计模式,如图所示:
这里写图片描述

在Java中可以直接依靠Observable类和Observer接口轻松地实现以上功能

观察者模式实现

在java.util包中提供了Observable类和Observer类接口,使用它们即可完成观察者模式。需要被观察的类必须继承Observable类,Observable类的常用方法如表所示:
这里写图片描述

然后每一个观察者类都需要实现Observer接口,Observer接口定义如下:

public interface Observer{
     void update(Observable o,Object arg);
}     

在此接口中只定义了一个update方法,第一个参数表示被观察者实例,第二个参数表示修改的内容。

具体的代码实现如下所示:

import java.util.* ;
class House extends Observable{ // 表示房子可以被观察
    private float price ;// 价钱
    public House(float price){
        this.price = price ;
    }
    public float getPrice(){
        return this.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 ;
    }
    public void update(Observable o,Object arg){
        if(arg instanceof Float){
            System.out.print(this.name + "观察到价格更改为:") ;
            System.out.println(((Float)arg).floatValue()) ;
        }
    }
};
public class ObserDemo01{
    public static void main(String args[]){
        House h = new House(1000000) ;
        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(666666) ;    // 修改房子价格
        System.out.println(h) ; // 输出房子价格
    }
};

程序运行结果:
这里写图片描述

从程序的运行结果可以发现,多个观察者都在关注着价格的变化,只要价格一有变化,则所有的观察者会立刻有所行动。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值