Observer-观察者模式

概述:

发送状态变化通知
当观察对象的状态发生变化事,会通知观察者

Observer_sample


说明:

1.本文仅仅是对 图解设计模式 的简单总结(个人笔记).
2.文章中的图片均来自本书,添加水印只是为了防止盗链行为,并无侵权的想法.
综上,若侵权, 请联系删除!
转载请标注出处!


案例:

  • 案例说明:

    观察者将观察一个会生成数值的对象,并将他生成的数值结果显示出来

  • Observer_uml_case
  • 主要代码:
    NumberGenerator:
package Gof.Observer;
import java.util.ArrayList;
import java.util.Iterator;

public abstract class NumberGenerator {
    private ArrayList observers = new ArrayList();        // 保存Observer们
    public void addObserver(Observer observer) {    // 注册Observer
        observers.add(observer);
    }
    public void deleteObserver(Observer observer) { // 删除Observer
        observers.remove(observer);
    }
    public void notifyObservers() {               // 向Observer发送通知
        Iterator it = observers.iterator();
        while (it.hasNext()) {
            Observer o = (Observer)it.next();
            o.update(this);
        }
    }
    public abstract int getNumber();                // 获取数值
    public abstract void execute();                 // 生成数值
}

  • 代码链接:传送门

    uml综述Observer_uml

  • Subject(观察对象): 定义了注册观察者和删除观察者的方法
  • ConcreteSubject(具体的观察对象): 表示被观察对象, 当自身状态发生变化后,他会通知已经注册的Observer对象
  • Observer(观察者): 负责接受来自subject对象的状态变化的通知
  • ConcreteObserver:具体的Observer,当他的Update方法被调用时,回去获取要观察的对象的最新状态

收获:

  • 可替换性设计思想:
    • 利用抽象类和接口从具体类中抽出抽象方法
    • 在将实例作为参数传递到类中,或者在类的字段中保存实例时,不使用具体类型,而是使用抽象类型和接口
  • Subject状态变化 -> 通知Observer -> Observer调用Subject的方法 -> 导致Subject状态变化 -> 通知Observer …

相关设计模式:

  • Mediator: 有时使用Observer模式实现Mediator角色与colleague角色之间的通信

注意:

此部分内容属于对GOF Design Pattern知识的初步认知阶段,参考书籍是结城浩的《图解设计模式》,简单易懂,十分推荐!
以上内容,作者一字一句码出来的,纯属不易,欢迎大家转载,转载是还请您表明出处。另外如果我有侵权行为,请在下方留言,确认后我会及时撤销相应内容,谢谢大家!

PS:欢迎大家来到我的小站,鸣谢!