java# 设计模式# 观察者模式 及应用场景

观察者模式

观察者模式分为两端,观察者与被观察者。观察者实现接收通知接口。被观察者实现添加观察者,添加,调用通知接口。两者关系为一对多。被观察者一,观察者多。

应用场景

观察者模式,多应用于一对多的业务逻辑。且观察者与被观察者不会产生交集。使用观察者模式后方便观察者与被观察者解耦。

代码示例

// 观察者接口
public interface Observer {
	public void update(String message);
}
// 观察者实现(多)
public class ConcreteObserver implements Observer {
	private String name;
	private String message;
	public ConcreteObserver(String name) {
		this.name = name;
	}
	@Override
	public void update(String message) {
		this.message = message;
		this.read();
	}
	public void read() {
		System.out.println(name + "收到消息:" + message);
	}
}
// 被观察者接口
public interface Subject {
	/**
	 * @param o 观测者
	 * @return void
	 * @Description 注册观察者
	 **/
	public void registerObserver(Observer o);
	/**
	 * @param o 观察者
	 * @return void
	 * @Description 删除观察者
	 **/
	public void removeObserver(Observer o);
	/**
	 * @param
	 * @return void
	 * @Description 通知观察这
	 **/
	public void notifyObserver();
}
// 被观察者实现(一)
public class ConcreteSubject implements Subject {

	private Vector<Observer> observers;

	private String message;

	public ConcreteSubject() {
		observers = new Vector<>();
	}

	@Override
	public void registerObserver(Observer o) {
		observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		if (!observers.isEmpty()) {
			observers.remove(o);
		}
	}

	@Override
	public void notifyObserver() {
		for (Observer observer : observers) {
			observer.update(message);
		}
	}

	public void send(String message) {
		this.message = message;
		this.notifyObserver();
	}
}

扩展

在 java.util.Observer 中有现成的观察者模式。但被观察者java.util.Observable 中的观察者集合用的是Vector。涉及线程安全问题.如被观察者会涉及线程安全问题。建议使用Vector.

java.util.Observable 有意思的地方在于 接收通知时,将被观察者对象直接传给了观察者。

原文地址:https://www.cnblogs.com/xy-c/p/14240185.html