观察者模式----Java常用类库

    技术2022-07-10  106

    文章目录

    观察者模式----Java常用类库前言实现步骤Observable类主要方法Observer接口的主要方法 案例演示运行结果

    观察者模式----Java常用类库

    前言

    ​ 观察者模式,即设定一个类(商品类等),当它的属性信息发生改变时,所有观察此类(商品)的用户都会实时更新所发生的变化。

    ​ 例如,现在很多的购房者都关注着房子的价格变化,每当价格发生变化时,所有的购房者都可以观察得到,实际上以上的购房者都属于观察者,他们都在观察着房子的价格,此为观察者模式。

    实现步骤

    ​ 若想实现观察者模式,必须包含被观察者和观察者

    ​ 继承Observable的类称为被观察者类,即此类的一些状态发生改变时,会被观察者观察到

    ​ 实现Observer接口的类为观察者类,即为一个个的观察者,观察状态改变。

    Observable类主要方法

    序号方法类型描述1public void addOberver(Observer o)普通增加一个观察者2public void deleteObserver(Observer o)普通删除一个观察者3public void setChanged()普通被观察者状态发生改变4public void notifyObservers(Object arg)普通通知所有的观察者状态改变

    Observer接口的主要方法

    序号方法类型描述1public void update(Observable o, Object arg)普通第一个参数表示被观察者实例,第二个参数表示要修改的内容,当观察者被通知状态发生改变时,自动调用此方法

    案例演示

    观察者模式的实现

    package chapter_eleven; import java.util.Observable; import java.util.Observer; class House extends Observable{ //继承Observable的类为被观察者类 private float price; //定义价格 public House(){} //定义构造方法 public House(float price){ this.price = price; } //setter和getter方法 public void setPrice(float price){ // this.price = price; super.setChanged(); //使被观察者的状态发生改变 super.notifyObservers(price); //通知所有的观察者的价格发生改变 this.price = price; } public float getPrice(){ return this.price; } @Override public String toString() { return "房子的价格---->" + price; } } class HousePriceObserver implements Observer{ //实现Observer接口的类称为观察者类 private String name; //声明name属性 public HousePriceObserver(){} //定义包含参数和无参数的构造方法 public HousePriceObserver(String name){ this.name = name; } @Override public void update(Observable o, Object arg) { //定义update方法,当被观察者状态发生改变时执行此方法 if(arg instanceof Float){ System.out.println(this.name + "观察到价格更改为---->" + ((Float) arg).floatValue()); } } } public class ObserDemo01 { public static void main(String[] args) { House h = new House(1000000); System.out.println("最初房子的价格---->" + h); //输出房子的价格 HousePriceObserver housePriceObserver01 = new HousePriceObserver("购房者A"); HousePriceObserver housePriceObserver02 = new HousePriceObserver("购房者B"); HousePriceObserver housePriceObserver03 = new HousePriceObserver("购房者C"); h.addObserver(housePriceObserver01); //为房子增加观察者 h.addObserver(housePriceObserver02); h.addObserver(housePriceObserver03); h.setPrice(666); System.out.println("发生改变以后房子的价格---->" + h); //输出房子的价格 h.setPrice(888); System.out.println("发生改变以后房子的价格---->" + h); //输出房子的价格 } }

    运行结果

    最初房子的价格---->房子的价格---->1000000.0 购房者C观察到价格更改为---->666.0 购房者B观察到价格更改为---->666.0 购房者A观察到价格更改为---->666.0 发生改变以后房子的价格---->房子的价格---->666.0 购房者C观察到价格更改为---->888.0 购房者B观察到价格更改为---->888.0 购房者A观察到价格更改为---->888.0 发生改变以后房子的价格---->房子的价格---->888.0
    Processed: 0.015, SQL: 9