设计模式之观察者模式

1.简要概述

  • 观察者模式定义了对象之间的一对多关系,也就是说当一个对象的状态发生变化时,会告知其它的依赖对象也做相应的状态更新。
  • 观察者模式中,发送状态变化通知的对象称之为目标对象(Subject),接收并响应状态变化的对象称之为观察者对象(Observer)。

2.模式结构

👉通常由一个主题接口( 负责定义管理、维护、通知观察者的一系列方法接口 ),多个具体的主题类( 负责实现对于观察者的注册、移除、通知等功能的内部逻辑 ),一个观察者接口( 负责定义接收通知并更新的方法接口 ),多个具体的观察者类( 负责为不同的观察者实现不同的更新内部逻辑 ),一个客户类( 负责对主题类和观察者类进行调用)共同组成。

请添加图片描述

3.实现代码

举例 💡 :假设现在有一个新闻网站可供用户订阅,当网站发布新的新闻时,则会通知每个订阅者进行了更新。那么这个过程我们就可以使用观察者模式来进行处理。

发布者接口

public interface Publish {
    void register(Observer observer);

    void remove(Observer observer);

    void notify();
}

新闻发布者

public class NewsPublish implements Publish {
    private String news;
    
    private List<Observer> observers;

    public NewsPublish() {
        observers = new ArrayList<>();
    }

    public void setNews(String content) {
        this.news = content;
    }

    @Override
    public void register(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void remove(Observer observer) {
        if (observers.contains(observer)) {
            observers.remove(observer);
        }
    }

    @Override
    public void notify() {
        for (Observer observer : observers) {
            observer.update(news);
        }
    }
}

观察者接口

public interface Observer {
    void update(String content);
}

观察者

public class UserObserver implements Observer {

    @Override
    public void update(String content) {
        System.out.println("新闻更新: " + content);
    }
}

客户类

// 测试客户端
public class ObserverClient{
    public static void main(String[] args) {
		// 创建观察者
        Observer o1 = new UserObserver();
        Observer o2 = new UserObserver();
        
        // 创建发布者
        Publish publish = new NewsPublish();
        publish.add(o1);
        publish.add(o2);
        
        // 更新内容并通知观察者
        publish.setNews("新的新闻");
        publish.notify();
    }
}

4.优点好处

  • 观察者模式在被观察者和观察者之间建立一个抽象的耦合, 由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
  • 在观察者模式中,我们可以随意的添加和移除指定的观察者,而不需要对发布者进行内部逻辑的更改,所以符合OCP原则。

5.缺点弊端

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 如果在被观察者之间有循环依赖的话,被观察者在执行时很有可能发生循环调用,导致系统崩溃。

6.应用场景

  • 当我们想要在系统中实现类似于广播机制功能的时候使用。
  • 当对一个对象状态进行更新,需要其它有所关联的对象也同步进行更新,而且其它对象的数量可以动态改变的时候使用。
  • 当一个对象仅需要将自己的更新通知给其它对象,而不需要让其它对象知道内部细节的时候使用。

7.应用示例

JDK源码中的Observable类

  1. 这里的Observable类就相当于观察者模式中的主题类,只不过这里没有实现任何接口,直接进行的实现。

    请添加图片描述

  2. 我们看到在Observable类中同样定义了添加观察者、移除观察者、通知观察者的一系列方法。

    请添加图片描述

    请添加图片描述

    请添加图片描述

  3. 这里的Observer类就是观察者接口,里面定义了通知更新的update方法。

    请添加图片描述

  4. 所以从上面的过程分析可以看出,JDK中的Observable类的设计就是使用的观察者模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值