观察者模式

一   概述 

            定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

二    适用性

1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面将这二者封装在独立的对象中以使它们可以各自独立地改变和复用

2.当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变

3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。

三     参与者

1.Subject(目标) 目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者对象的接口。 

 2.Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口。

 3.ConcreteSubject(具体目标) 将有关状态存入各ConcreteObserver对象。 当它的状态发生改变时,向它的各个观察者发出通知。

 4.ConcreteObserver(具体观察者) 维护一个指向ConcreteSubject对象的引用。 存储有关状态,这些状态应与目标的状态保持一致。 实现Observer的更新接口以使自身状态与目标的状态保持一致

代码示例

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、付费专栏及课程。

余额充值