Java设计模式笔记(6)观察者模式

本文介绍了观察者模式的基本概念,通过示例代码展示了如何利用自定义类及Java标准库实现观察者模式。文中详细解释了Subject(被观察者)、Observer(观察者)等核心角色的功能与实现方式。

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

观察者模式,也叫发布订阅模式,定义对象之间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

观察者模式的几个角色:

Subject被观察者:定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅是完成作为被观察者必须实现的职责。

Observer观察者:观察者收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。

ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义哪些事件进行通知。

ConcreteObserver具体的观察者:每个观察者在接受到消息后的处理反应是不同,各个观察者有自己的处理逻辑。

1. 代码

// 被观察者
public abstract class Subject {
	// 定一个一个观察者数组 ArrayList是线程异步,不安全,Vector是线程同步,安全
	private Vector<Observer> obsVector = new Vector<Observer>();

	// 增加一个观察者
	public void addObserver(Observer o) {
		this.obsVector.add(o);
	}

	// 删除一个观察者
	public void delObserver(Observer o) {
		this.obsVector.remove(o);
	}

	// 通知所有观察者
	public void notifyObserver() {
		for (Observer o : this.obsVector) {
			o.update();
		}
	}
}

// 具体的被观察者
public class ConcreteSubject extends Subject {

	// 具体的业务
	public void doSomething() {
		/*
		 * do something
		 */
		super.notifyObserver();
	}
}

// 观察者
public interface Observer {

	// 更新方法
	public void update();
}

// 具体观察者
public class ConcreteObserver implements Observer {

	// 实现更新方法
	public void update() {
		System.out.println("接收到信息,并进行处理!");
	}

}

// 场景类
public class Client {

	public static void main(String[] args) {
		// 创建一个被观察者
		ConcreteSubject subject = new ConcreteSubject();
		// 定义一个观察则
		Observer obs = new ConcreteObserver();
		// 观察者观察被被观察则
		subject.addObserver(obs);
		// 观察者开始活动了
		subject.doSomething();
	}

}


2. 使用java.util包中的标准类实现观察者模式

JDK提供了对观察者模式的支持接口和实现类。

其中接口 java.util.Observer 用来指定观察者,观察者必须实现 void update(Observable o, Object arg) 方法,参数 Observable o 用于指定触发 update 方法的对象, Object arg 用于指定触发 update 方法时候的附加参数。而 java.util.Observable 用来指定观察物(被观察者、可被观察的),并且提供了一系列的方法。

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

/**
 * 使用java.util包中的标准类实现观察者模式
 */
public class ObserverClient {

	public static void main(String[] args) {
		ObserverClient client = new ObserverClient();

		// 被观察者
		ConcreteSubject1 subject1 = client.new ConcreteSubject1(1);
		ConcreteSubject2 subject2 = client.new ConcreteSubject2("userek");
		// 观察者
		Observer observer1 = client.new ConcreteObserver1();
		Observer observer2 = client.new ConcreteObserver2();
		// 注册
		subject1.addObserver(observer1);
		subject1.addObserver(observer2);
		subject2.addObserver(observer1);
		// 改变被观察者状态,触发观察者回调函数
		subject1.doSomething();
		subject2.doSomething();
	}

	class ConcreteSubject1 extends Observable {

		private int mSubjectValue;
		
		private ConcreteSubject1(int mSubjectValue) {
			super();
			this.mSubjectValue = mSubjectValue;
		}

		public void doSomething() {
			setChanged();
	        notifyObservers(mSubjectValue);
		}
		
		@Override
		public String toString() {
			return getClass().getSimpleName();
		}

	}

	class ConcreteSubject2 extends Observable {

		private String mSubjectName;
		
		private ConcreteSubject2(String mSubjectName) {
			super();
			this.mSubjectName = mSubjectName;
		}

		public void doSomething() {
			setChanged();
	        notifyObservers(mSubjectName);
		}
		
		@Override
		public String toString() {
			return getClass().getSimpleName();
		}

	}
	
	class ConcreteObserver1 implements Observer {

		@Override
		public void update(Observable o, Object arg) {
			System.out.println("第一个 Observer!" + " 被观察者 : " + o + ", 观察的值为" 
					+ (arg instanceof Integer ? "整型" : "字符串") + ": " + arg);
		}

	}
	
	class ConcreteObserver2 implements Observer {

		@Override
		public void update(Observable o, Object arg) {
			System.out.println("第二个 Observer!");
		}

	}

}


内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值