设计模式之观察者模式(Java实现)

本文深入解析观察者模式,介绍其核心概念与应用实例。通过Java代码实现,展示如何构建观察者与被观察者的关系,以及在主题变化时通知所有观察者的机制。同时,探讨了循环引用和异步实现的问题,并介绍了Java提供的观察者模式实现。

    观察者模式是设计模式中常见的一种模式,他的思想犹如他的名字一样,就是想构建一个观察者观察他所关注的主题,当主题发生变化了,就会通知观察者。观察者模式也叫发布订阅模式,这种设计模式用在了很多地方,比如zookeeper的节点观察机制。

    这里我们构建一个如下模型,Subject<-AbstractSubject<-TopSubject  与 Observer<-Watcher,他们的关系如下图所示:

通过java实现:

Observer.java

package com.xxx.design.watcher;

public interface Observer {
	void update();
}

Watcher.java

package com.xxx.design.watcher;
/**
 * 观察者
 *
 */
public class Watcher implements Observer {
	
	private String name;
	public Watcher(String name) {
		this.name = name;
	}

	@Override
	public void update() {
		System.out.println("watcher "+name+" update state.");
	}

}

Subject.java

package com.xxx.design.watcher;

public interface Subject {
	void add(Observer observer);
	void delete(Observer observer);
	void notifyObserver();
	void action();
}

AbstractSubject.java

package com.xxx.design.watcher;
import java.util.Enumeration;
import java.util.Vector;
public abstract class AbstractSubject implements Subject{
	private Vector<Observer> obs = new Vector<Observer>();
	
	@Override
	public void add(Observer observer) {
		obs.add(observer);
	}
	
	@Override
	public void delete(Observer observer) {
		obs.remove(observer);
	}
	
	@Override
	public void notifyObserver() {
		Enumeration<Observer> eles = obs.elements();
		while(eles.hasMoreElements()){
			eles.nextElement().update();
		}
	}
}

TopSubject.java

package com.xxx.design.watcher;

public class TopSubject extends AbstractSubject {

	@Override
	public void action() {
		System.out.println("i am a subject,update now.");
		notifyObserver();
	}
	
	public static void main(String[] args) {
		Subject subject = new TopSubject();
		subject.add(new Watcher("aa"));
		subject.add(new Watcher("bb"));
		subject.add(new Watcher("cc"));
		subject.action();
	}

}

    运行程序,打印结果如下:

i am a subject,update now.
watcher aa update state.
watcher bb update state.
watcher cc update state.

    观察者需要注意的是:避免循环引用,如果是顺序执行,考虑采用异步实现,避免因为一个处理异常导致整个系统卡壳。另外,现在java.util包中api已经提供了观察者模式的实现。我们可以利用Observable类和Observer接口来实现一个观察者模式:

Subscribe.java

package com.xxx.design.watcher.jdk;

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

public class Subscribe implements Observer {
	
	private String name;
	public Subscribe(String name){
		this.name = name;
	}
	
	public void add(Observable o){
		o.addObserver(this);
	}

	@Override
	public void update(Observable o, Object arg) {
		System.out.println(name+" 收到通知:"+((Publish)o).getData());
	}

}

Publish.java

package com.xxx.design.watcher.jdk;
import java.util.Observable;
public class Publish extends Observable {
	private String data = "";
	public String getData() {
		return data;
	}
	
	public void setData(String data) {
		if(!this.data.equals(data)){
			this.data = data;
			setChanged();
		}
		notifyObservers();
	}
	
	public static void main(String[] args) {
		Publish publish = new Publish();
		Subscribe subscribe = new Subscribe("aaa");
		subscribe.add(publish);
		Subscribe subscribe2 = new Subscribe("bbb");
		subscribe2.add(publish);
		publish.setData("start");
		publish.setData("end");
	}
}

运行程序,打印信息如下:

bbb 收到通知:start
aaa 收到通知:start
bbb 收到通知:end
aaa 收到通知:end

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值