headfirst设计模式——观察者模式

本文深入解析观察者模式,一种常用的设计模式,用于实现对象间的一对多依赖关系。通过具体代码示例,如进度条更新通知,展示了如何使用观察者模式进行有效的状态更新通知。

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

定义

 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

类图 

具体代码实现

需求:有一个进度生成器, 用来模拟进度条的数值. 当进度数值更新后, 就会通知进度栏更新值. 也就是进度栏是观察者, 随时间在变的进度值是主题内容。

Observer接口

//观察者接口,观察者统一定义
public interface Observer {
	/**
	* 观察者会被数值生成器通知,来更新自己的状态。
	* @param 被观察的进度条类
	*/
	void update(ProgressBar generator);
}

DigitObserver类

//数字进度类. 这是其中一种观察者的实现, 也是一种具体的进度条.
public class DigitObserve implements Observer {
	
	/**
	* Observer(观察者)会被数值生成器通知, 来更新自己的状态。
	* @param 被观察的进度条类
	*/
	@Override
	public void update(ProgressBar generator) {
		System.out.println("数字版进度条:" + generator.getNumber() + "%");
	}
}

GraphObserver类

//图形进度条类, 这是其中一种观察者的实现, 也是一种具体的进度条.
public class graphObserver implements Observer {
	
	public void update (ProgressBar generator) {
		System.out.println("图形版进度条:" + generator.getNumber() + "%");
	}
}

ProgressBar类

// 生成数值的类, 同时会保存观察者们, 当数值生成的时候就会去通知所有观察者们
public class ProgressBar {
	
	//保存观察者们的集合
	private List<Observer> observerList = new ArrayList();
	//当前进度条的数值
	private int number;
	
	/**
	* 当前进度条的数值
	* @param 返回当前进度条的数值
	*/
	public int getNumber() {
		return number;
	}
	
	/**
	* 生成数值并通知观察者们更新
	*/
	public void execute() {
        for (int i = 0; i <= 100; i += 10) {
            number = i;
            notifyObservers();
        }
    }
	
	/**
	* 添加观察者到进度条
	* @param 被添加的观察者
	*/
	public void addObserver(Observer observer) {
		observerList.add(observer);
	}
	
	/**
	* 向observer发送通知
	*/
	public void notifyObservers() {
		
		for (Observer o : Observers) {
			o.update();
		}
		
		try {
            System.out.println();
            Thread.sleep(400);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
	}
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值