观察者模式巩固学习

本文详细介绍了观察者模式的原理及其实现方式。通过定义一对多的依赖关系,多个观察者对象能同时监听某一主题对象,并在该主题状态发生变化时自动更新。文章提供了具体的代码示例,包括观察者接口和主题接口的定义,以及如何通过构造具体类来实现这些接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

   观察者模式又叫发布-订阅(Publish/Subscribe)模式。

   总体步骤:
   1.定义观察者接口
   2.定义主题接口
   3.实例化主题对象
   4.主题对象添加观察者
   5.主题变化后,调用其notifyObserver()方法,通知所有已经注册过的观察者对象。
   6.观察者接收到通知后,做出相应处理。

   接下来,使用代码进行逐一阐述
   1.定义观察者接口

/**  
 * Observer(观察者 Observer):interface  
 * 为那些在主题发生改变时需要获得通知的对象定义一个更新接口。  
 */  
public interface Observer {

	public void update();
}
2.定义主题接口
/*
 * 被观察者interface
 * 被观察者(Observable)可以有任意多个观察者(Observer)观察  
 * 提供注册和删除观察者对象的接口
 * 当主题发生变更时,通知所有已经注册过的观察者对象  
 * */
public interface Observable {
	
	//在其接口中定义一个用来注册观察者的方法  
    public void addObserver(Observer observer);  
    
    //再定义一个用来删除观察者的方法  
    public void removeObserver(Observer observer);  
    
    //再定义一个可以实现行为变现并向观察者传输信息的方法  
    public void notifyObserver();  

}
  3.实例化主题对象 & 4.主题对象添加观察者

/*
 * 被观察者实现类
 * */
public class ConstructObservable implements Observable{
	// 定义一个用于登记观察者(Observer)的List
	private CopyOnWriteArrayList<WeakReference<Observer>> mObserverListeners = new CopyOnWriteArrayList<WeakReference<Observer>>();

	@Override
	public void addObserver(Observer observer) {
		// TODO Auto-generated method stub
		mObserverListeners.add(new WeakReference<Observer>(observer));
		
	}

	@Override
	public void removeObserver(Observer observer) {
		// TODO Auto-generated method stub
		mObserverListeners.remove(observer);
	}
	
	public void removeAllObserver() {
		// TODO Auto-generated method stub
        for (WeakReference<Observer> listenerWeakReference : mObserverListeners) {
            if (null != listenerWeakReference) {
            	mObserverListeners.remove(listenerWeakReference);
            }
        }
	}

	@Override
	public void notifyObserver() {
		// TODO Auto-generated method stub
        for (WeakReference<Observer> listenerWeakReference : mObserverListeners) {
            if (null != listenerWeakReference) {
            	Observer listener = listenerWeakReference.get();
            	listener.update();
            }
        }
	}
}
步骤5 & 步骤6

public class ObserverTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int cnt = 10;
		//实例化主题对象
		ConstructObservable observable = new ConstructObservable();
		
		//实例化观察者对象,并且注册
		for (int i = 1; i < cnt; i++) {
			ConstructObserver observer = new ConstructObserver("ConstructObserver id = " + i);
			observable.addObserver(observer);
		}
		
		//通知观察者
		observable.notifyObserver(); 
		
		//remove
		observable.removeAllObserver();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值