美文网首页
设计模式--观察者模式

设计模式--观察者模式

作者: BlueSocks | 来源:发表于2023-10-08 17:12 被阅读0次

    一 简介

    观察者模式(observer pattern): 属于行为型设计模式。在对象之间定义一对多的依赖, 这样一来, 当一个对象改变状态, 依赖它的对象都会收到通知, 并自动更新。

    二 意图

    定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。

    三 结构

    目标 (Subject)具有注册和移除观察者、并通知所有观察者的功能,主要是通过维护一张观察者列表来实现这些操作的。

    观察者(Observer)的注册功能需要调用目标的 registerObserver()方法。

    6.png

    Subject(目标):被观察者,它是指被观察的对象。

    ConcreteSubject(具体目标):具体目标是目标类的子类,通常它包含经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知。同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。

    Observer(观察者):观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法 update(),因此又称为抽象观察者

    ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者 Observer 中定义的 update()方法。

    四 代码实现

    目标类:Subject

    abstract class Subject {
        private Vector<Observer> obs = new Vector();
    
        public void addObserver(Observer obs){
            this.obs.add(obs);
        }
        public void delObserver(Observer obs){
            this.obs.remove(obs);
        }
        protected void notifyObserver(){
            for(Observer o: obs){
                o.update();
            }
        }
        public abstract void doSomething();
    }
    
    
    

    具体的目标类:ConcreteSubject

    class ConcreteSubject extends Subject {
        public void doSomething(){
            System.out.println("被观察者事件发生改变");
            this.notifyObserver();
        }
    }
    
    

    观察者接口:Observer

    interface Observer {
        public void update();
    }
    
    

    具体的观察者:ConcreteObserver1、2

    class ConcreteObserver1 implements Observer {
        public void update() {
            System.out.println("观察者 1 收到信息,并进行处理");
        }
    }
    class ConcreteObserver2 implements Observer {
        public void update() {
            System.out.println("观察者 2 收到信息,并进行处理");
        }
    }
     
    
    

    客户类调用:

    public class Client {
        public static void main(String[] args){
            Subject sub = new ConcreteSubject();
            sub.addObserver(new ConcreteObserver1()); //添加观察者 1
            sub.addObserver(new ConcreteObserver2()); //添加观察者 2
            sub.doSomething();
        }
    }
    
    

    输出:

    被观察者事件发生改变
    观察者 1 收到信息,并进行处理
    观察者 2 收到信息,并进行处理
    
    

    五 总结

    优点

    • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系
    • 目标与观察者之间建立了一套触发机制
    • 支持广播通信
    • 符合“开闭原则”的要求

    缺点

    • 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用
    • 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率

    使用场景

    • 当一个对象状态的改变需要通知其他对象,或实际对象是事先未知的或动态变化时,可使用观察者模式。
    • 当应用中的一些对象必须观察其他对象时,可使用该模式 但仅能在有限时间内或特定情况下使用。

    相关文章

      网友评论

          本文标题:设计模式--观察者模式

          本文链接:https://www.haomeiwen.com/subject/yxubbdtx.html