设计模式 - 行为型模式考点篇:观察者模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录

一、行为型模式

1.1、观察者模式

1.1.1、概述

1.1.2、案例实现

1.1.3、优缺点

1.1.4、使用场景


一、行为型模式


1.1、观察者模式

1.1.1、概述

观察者模式又称为 发布 - 订阅 模式.,就是让多个观察者对象同时监听同一个主题对象.  这个主题对象在变化的同时,也会把消息推送给所有观察者对象,使他们能够更新自己.

例如微信公众号,当微信用户点击关注某一公众号,当这个公众号的内容更新后,他就会把消息推送给所有关注了当前公众号的用户.  此时微信用户就是观察者,公众号就是被观察者.

观察者模式主要有以下角色:

  • 抽象主题:所有的观察者对象都放在一个 List 集合中,每一个主题都可以有任意数量的观察者,并且提供 增加 和删除 观察者对象的接口.
  • 具体主题:实现了抽象主题接口,并在有新的消息存入主题时,就会把消息推送给 List 中所有观察者.
  • 抽象观察者:定义了一个更新接口,使得在主题更新消息时能随时通知自己.
  • 具体观察者:实现了抽象观察者.

1.1.2、案例实现

实现上述案例.

/**
 * 抽象主题类
 */
public interface Subject {

    /**
     * 增加订阅者
     * @param observer
     */
    void attach(Observer observer);

    /**
     * 删除订阅者
     * @param observer
     */
    void detach(Observer observer);

    /**
     * 通知订阅者更新消息
     * @param message
     */
    void notify(String message);

}
/**
 * 抽象观察者接口
 */
public interface Observer {

    void update(String message);

}
/**
 * 具体主题类:微信公众号
 */
public class SubjectWeChat implements Subject {

    //存储订阅公众号的微信用户
    private List<Observer> userList = new ArrayList<>();

    @Override
    public void attach(org.example.behavioral_mode.observer_mode.Observer observer) {
        userList.add(observer);
    }

    @Override
    public void detach(org.example.behavioral_mode.observer_mode.Observer observer) {
        userList.remove(observer);
    }

    @Override
    public void notify(String message) {
        for (Observer observer : userList) {
            observer.update(message);
        }
    }
}
/**
 * 具体观察者:微信用户
 */
public class User implements Observer {

    //微信用户名
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " 用户收到: " + message);
    }

}
public class Client {

    public static void main(String[] args) {
        //微信公众号
        SubjectWeChat weChat = new SubjectWeChat();

        //订阅公众号
        weChat.attach(new User("李白"));
        weChat.attach(new User("杜甫"));
        weChat.attach(new User("辛弃疾"));

        //公众号更新消息,并推送给订阅的用户
        weChat.notify("微信公众号的诗集更新啦!");
    }

}

执行结果如下:

1.1.3、优缺点

优点:

解耦合:降低了主题和观察者之间的耦合关系.

实现广播机制:主题发送通知,所有注册的观察者都能收到消息.

缺点:

如果观察者非常多,那么可能会有性能上的损耗.

如果主题有循环依赖的话,那么主题发送通知会使观察者循环调用,导致系统崩溃.

1.1.4、使用场景

当对象间存在 一对多 关系,一个对象的状态发生改变会影响到其他对象.

类似 发布 - 订阅模式时.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈亦康

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

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

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

打赏作者

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

抵扣说明:

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

余额充值