说明

在 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
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐