首页 > 代码库 > 观察者模式

观察者模式

观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

Observer模式的典型应用
- 侦听事件驱动程序设计中的外部事件
- 侦听/监视某个对象的状态变化
- 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者

Observer模式的优点
- 对象之间可以进行同步通信
- 可以同时通知一到多个关联对象
- 对象之间的关系以松耦合的形式组合,互不依赖


Observer模式的角色:
Subject(被观察者)
    被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
    被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
    接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver
    观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

package gof23;

import java.util.LinkedList;
import java.util.List;

public class ObserverTest {
	public static void main(String[] args) {
		Subject boss = new Boss();
		
		StockObserver colleague1 = new StockObserver("张三", boss);
		NBAObserver colleague2 = new NBAObserver("李四", boss);
		
		boss.attach(colleague1);
		boss.attach(colleague2);
		
		boss.setAction("你们的老板我第一次回来了");
		boss.notifyObserver();
		System.out.println();
		boss.detach(colleague2);
		boss.setAction("你们的老板我第二次回来了");
		boss.notifyObserver();
	}
}

/*
 * 通知者接口
 */
interface Subject{
	int i =10;
	//增加观察者
	public void attach(Observer observer);
	//移除观察者
	public void detach(Observer observer);
	//通知
	public void notifyObserver();
	//返回状态
	public String getAction();
	//设置状态
	public void setAction(String action);
}

/*
 * 老板作为通知者
 */
class Boss implements Subject {
	private List<Observer> observers = new LinkedList<>();
	private String action;
	@Override
	public void attach(Observer observer) {
		observers.add(observer);
	}

	@Override
	public void detach(Observer observer) {
		observers.remove(observer);
	}

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

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}
}

/*
 * 秘书作为通知者
 */
class Secretary implements Subject {
	private List<Observer> observers = new LinkedList<>();
	private String action;
	@Override
	public void attach(Observer observer) {
		observers.add(observer);
	}

	@Override
	public void detach(Observer observer) {
		observers.remove(observer);
	}

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

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}
}

/*
 * 观察者抽象类
 */
abstract class Observer {
	protected String name;
	protected Subject subject;
	
	public Observer(String name, Subject sub){
		this.name = name;
		this.subject = sub;
	}
	public abstract void update();
}

/*
 * 股票观察者
 */
class StockObserver extends Observer {

	public StockObserver(String name, Subject sub) {
		super(name, sub);
	}

	@Override
	public void update() {
		System.out.println(name + "," + subject.getAction() + " 关闭股票行情,继续工作!");
	}
	
}

/*
 * NBA观察者
 */
class NBAObserver extends Observer {

	public NBAObserver(String name, Subject sub) {
		super(name, sub);
	}

	@Override
	public void update() {
		System.out.println(name + "," + subject.getAction() + " 关闭NBA直播,继续工作!");
	}
	
}

运行结果为:

张三,你们的老板我第一次回来了 关闭股票行情,继续工作!
李四,你们的老板我第一次回来了 关闭NBA直播,继续工作!

张三,你们的老板我第二次回来了 关闭股票行情,继续工作!


观察者模式