设计模式之观察者模式

Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.


本篇博客属于《Java设计模式》系列之一,内容主要借鉴于 秦小波的著作《设计模式之禅》,在理解过程中可能还参考其他博主的知识,最后整理成自己的学习笔记,在此分享给大家。由于本人知识和能力有限,博客中有错误或者理解偏差的地方,还望同行及前辈们多多探讨和指点,感谢不尽。(目前本人还在实习阶段,个人认为设计模式还是要结合自己的实际经验去理解更佳,暂时更新最常见设计模式9+1篇。立个flag,将来一定会补齐)–2020.11.22

序号内容链接地址
1设计模式六大原则https://blog.csdn.net/Dawn510/article/details/109501957
2单例模式https://blog.csdn.net/Dawn510/article/details/109541109
3工厂模式https://blog.csdn.net/Dawn510/article/details/109588909
4抽象工厂模式及与工厂模式区别https://blog.csdn.net/Dawn510/article/details/109609350
5模板方法模式https://blog.csdn.net/Dawn510/article/details/109609368
6建造者模式https://blog.csdn.net/Dawn510/article/details/109609385
7代理模式https://blog.csdn.net/Dawn510/article/details/109633416
8装饰模式https://blog.csdn.net/Dawn510/article/details/109663917
9适配器模式https://blog.csdn.net/Dawn510/article/details/109962821
10观察者模式https://blog.csdn.net/Dawn510/article/details/109962858

定义

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。

观察者通用类图:
在这里插入图片描述

  • Subject被观察者:定义被观察者必须实现的职责,必须能够动态地增加、取消观察者。
  • Observer观察者:观察者收到消息后,即进行update
  • ConcreteSubject具体被观察者:定义被观察者自己的业务逻辑
  • ConcreteObserver具体观察者:每个观察者收到消息后的处理反应不同,每个观察者有自己的处理逻辑。

被观察者:

public abstract class Subject {
    // 定义一个观察者数组
    private Vector<Observer> observerVector = new Vector<Observer>();

    // 增加观察者
    public void addObserver(Observer o){
        this.observerVector.add(o);
    }
    // 删除观察者
    public void delObserver(Observer o){
        this.observerVector.remove(o);
    }

    // 通知所有观察者
    public void notifyObservers(){
        for (Observer observer : this.observerVector) {
            observer.update();
        }
    }
}

具体被观察者:

public class ConcreteSubject extends Subject{
    // 具体的业务
    public void doSomething(){
        /**
         * do something
         */
        System.out.println("执行吃饭业务");
        super.notifyObservers();

    }
}


观察者:

public interface Observer {
    // 更新方法
    public void update();
}

具体观察者:

public class ConcreteObserver implements Observer{
    @Override
    public void update() {
        System.out.println("报~~~~大王,他活动了!");
    }
}

场景类:

public class Client {
    public static void main(String[] args) {
        // 创建一个被观察者
        ConcreteSubject subject = new ConcreteSubject();
        // 定义一个观察者
        Observer obs = new ConcreteObserver();
        // 观察者观察被观察者
        subject.addObserver(obs);
        // 观察者活动了
        subject.doSomething();
    }
}

观察者模式的优缺点

优点:

  1. 观察者和被观察者直接是抽象耦合
  2. 建立一套触发机制,把单一职责串联成真实世界的复杂逻辑关系。比如,去打猎,打死一只母鹿,母鹿有三只幼崽,幼崽饿死,引来秃鹰抢夺,分配不均,秃鹰斗殴,获胜秃鹰因此扩大了地盘…这是一个触发机制,形成了一个触发链。

缺点:一个观察者卡壳,会影响整体的执行效率。

注意:

  1. 一个观察者模式中最多出现一个对象既是观察者又是被观察者,消息最多转发一次(传递两次),否则逻辑复杂,可维护性差。
  2. 观察者较多的时候,影响效率,可以采用异步处理。(异步要考虑线程安全和队列问题)

应用

适用场景:

  • 并联行为场景
  • 事件多级触发场景
  • 跨系统的消息交换场景,如消息队列的处理机制

Java中的观察者模式

Java中已经造好轮子了,java.util.Observable这个类就是为了暴露的,被观察者继承Observable把自己的状态变更让别人知道,去触发。观察者可以实现java.util.Observer,从而实现观察者模式。

发布/订阅模型

消息的发布者发布一个消息,通知订阅者作出回应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值