观察者模式
观察者模式(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直播,继续工作! 张三,你们的老板我第二次回来了 关闭股票行情,继续工作!
浙公网安备 33010602011771号