一、模式动机
观察者模式用于描述对象之间的依赖关系,它引入了观察者和观察目标两类不同的角色,由于提供了抽象层,它使得增加新的观察者和观察目标都很方便。观察者模式广泛应用于各种编程语言的事件处理模型中,Java语言也提供了对观察者模式的全面支持。
- 一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变,它们之间将产生联动
- 定义了对象之间一种一对多的依赖关系,让一个对象的改变能够影响其他对象
- 发生改变的对象称为观察目标,被通知的对象称为观察者
- 一个观察目标可以对应多个观察者
二、模式定义
- 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
- 观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式
- 观察者模式是一种对象行为型模式
三、模式结构
抽象目标类
- public abstract class Subject {
- protected ArrayList observers<Observer> = new ArrayList();
- public void attach(Observer observer) {
- observers.add(observer);
- }
- public void detach(Observer observer) {
- observers.remove(observer);
- }
- public abstract void notify( );
- }
复制代码具体目标类
- public class ConcreteSubject extends Subject {
- //实现通知方法
- public void notify() {
- for(Object obs:observers) {
- ((Observer)obs).update();
- }
- }
- }
复制代码抽象观察者类
- public interface Observer {
- public void update();
- }
复制代码具体观察者类
- public class ConcreteObserver implements Observer {
- public void update() {
- ……
- }
- }
复制代码 四、案例实现
案例背景
股票
案例结构
代码实现
抽象目标类:股票
- public interface Stocks {
- ArrayList<Observer> OBSERVERS = new ArrayList<>();
- void attach(Observer observer);
- void detach(Observer observer);
- void notifyInvestor();
- }
复制代码目标类:股票
[code]public class Stock implements Stocks{ private String stockName; private int price; public Stock(String stockName, int price) { this.stockName = stockName; this.price = price; } public Stock() { } public String getStockName() { return stockName; } public void setStockName(String stockName) { this.stockName = stockName; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public void attach(Observer observer) { OBSERVERS.add(observer); } @Override public void detach(Observer observer) { OBSERVERS.remove(observer); } @Override public void notifyInvestor() { if(price >= 25*1.05 || price |