观察者(Observer)模式

观察者模式详解
本文通过一个房价变动的例子详细介绍了观察者模式的实现方法。通过创建House类作为被观察者,并继承Observable类,同时定义HouseObserver类作为观察者,实现Observer接口。文章最后还提供了一个测试类来验证观察者模式的效果。


在众多的设计模式中观察者(Observer)模式用的也是比较多的,也许有人会问“什么是观察者(Observer)模式”。在这里呢就有这么个例子:房价是我们比较个关注的一个问题,一般来说只要房价发生变化,购房者就会知道,在程序里这些购房者就叫做“观察者”,房价的变化则是可观察的。这就是一个比较好的例子。那么我们也可以用程序来写一下这个例子。下面将会使用到一个类和两个接口,下面就为大家介绍一下。

被观察者必须实现Observable类,观察者则要实现Observer接口。

Observer接口如下所示:

public interface Observer{

void update(Observable o,Object arg);

}

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

我们可以先来看一下API文档,如图所示;




面列出来的就是我们要用到的东西,上面的图只是其中一部分,详细的可以自己去看文档。现在开始来一步一步的进行设计。

1.写一个House并继承Observable类。

package org.lxh.impl;

import java.util.Observable;

/*
 * 这里的House可以理解为"被观察者",所以要继承Observable
 */
public class House extends Observable {
	private int price;

	public House(int price) {
       this.price=price;
	}

	public void setPrice(int price) {
		super.setChanged();             //设置变化点
		super.notifyObservers(price);   //通知所有观察者价格已改变
		this.price = price;
	}

	public int getPrice() {
		return price;
	}

	public String toString() {
		return "房子的价格为:" + price;
	}
	
}



2.写一个房屋观察者HouseObserver,不要忘记让它实现Observer接口。如下所示

package org.lxh.impl;

import java.util.Observable;
import java.util.Observer;

public class HouseObserver implements Observer {
	String name;

	public HouseObserver(String name) {
       this.name=name;
	}

	public void update(Observable obser, Object obj) {
      if(obj instanceof Integer)   //判断参数类型
      {
    	  System.out.println(name+"观察到的房价是:"+obj.toString());  //这是其中一种取得obj值的方法
    	  //System.out.println(name+"观察到的房价是:"+((Integer)obj).intValue());  //这是另外一种取得obj值的方法
      }
	}

}

3.写一个测试类进行测试

package org.lxh.impl;

public class Test {

	/**
	 * 这个类用来对观察者模式进行测试
	 */
	public static void main(String[] args) {
		House h=new House(2000);
		HouseObserver ho1=new HouseObserver("Tom");
		HouseObserver ho2=new HouseObserver("Amy");
		HouseObserver ho3=new HouseObserver("Smith");
		h.addObserver(ho1);   //添加观察者
		h.addObserver(ho2);
		h.addObserver(ho3);
		System.out.println(h);
		System.out.println("================房价开始变化了===============");
		
		h.setPrice(2500);
		System.out.println(h);
		System.out.println("================删除一个观察者Amy===============");
		h.deleteObserver(ho2);   //删除观察者Amy
		h.setPrice(2600);
		System.out.println(ho2.name+"现在已经不是观察者了,所以不能获得房屋信息");
		System.out.println(h);
	}

}



下面看一下效果截图















                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值