java观察者设计模式

观察者模式定义了一个一对多的依赖关系。让一个或多个观察者可以监视某一对象,当该对象的状态发生变化时,就可以通知所有的观察者,观察者执行响应的动作。

在java中,被观察者必须继承Observable类,Observable类常用方法如下:

  • public void addObserver(Observer o)  添加一个观察者

  • public void deleteObserver(Observer 0)  删除一个观察者

  • protected void setChanged() 被观察者设置自己的状态发生了变化

  • public void notifyObservers(Object arg) 通知所有的观察者

每一个观察者都要实现Observer接口,Observer接口中只有一个update方法,

public void update(Observable o, Object arg)

第一个参数表示被观察者实例,第二个参数表示修改的内容。

被观察者代码:

package com.yeetrack.test;
      
import java.util.Observable;
      
public class Hourse extends Observable
{
    private int price; //自身的属性,代表房子价格
    public int getPrice()
    {
        return price;
    }
      
    public void setPrice(int price)
    {
        this.price = price;
        super.setChanged(); //设置自己的状态发生了变化
        super.notifyObservers(price);//通知被观察者price发生了变化
    }
    //构造方法
    public Hourse(int price)
    {
        this.price = price;
    }
}

观察者代码:

package com.yeetrack.test;
    
import java.util.Observable;
import java.util.Observer;
    
public class HoursePriceObserver implements Observer
{
    private String name; //观察者自己的名字
    public HoursePriceObserver(String name)
    {
        // TODO Auto-generated constructor stub
        this.name = name;
    }
    //Observer中的update方法,如果被观察者状态发生变化,就会自动调用此方法
    public void update(Observable o, Object arg)
    {
        // TODO Auto-generated method stub
        System.out.println(this.name+"  "+arg);
    
    }
}

测试代码:

package com.yeetrack.test;
   
public class TestObserve
{
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Hourse hourse = new Hourse(10000);
        HoursePriceObserver hpo1 = new HoursePriceObserver("111"); //初始化观察者1
        HoursePriceObserver hpo2 = new HoursePriceObserver("222"); //初始化观察者2
        hourse.addObserver(hpo1); //为hourse添加一个观察者
        hourse.addObserver(hpo2);
        hourse.setPrice(40000);//改动hourse的价格,观察者hpo1和hpo2会自动调用update方法。
    }
}
版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=31