前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【玩转23种Java设计模式】行为型模式篇:观察者模式

【玩转23种Java设计模式】行为型模式篇:观察者模式

作者头像
程序员云帆哥
发布2023-07-31 08:38:55
1650
发布2023-07-31 08:38:55
举报
文章被收录于专栏:程序员云帆哥

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

一、简介

  观察者模式是软件设计中的一种行为模式。它定义了对象之间的一对多关系,其中如果一个对象改变了状态,所有依赖它的对象都会自动被通知并更新。

  这种模式包含了两种主要的角色,即被观察者(Subject)和观察者(Observer)。

  • 被观察者:维护了一个观察者列表,并提供了注册和删除观察者的方法,当其状态发生变化时,会遍历观察者列表,通知所有观察者。
  • 观察者:定义了一个更新接口,用于接收被观察者的通知并进行相应的更新操作。

二、实例

订阅微信公众号文章。

1、抽象被观察者(Subject)

代码语言:javascript
复制
public interface Subject {
    void addObserver(Observer o);

    void removeObserver(Observer o);

    void notifyObserver();
}

2、具体被观察者(WeChatOfficialAccount)

代码语言:javascript
复制
@Slf4j
public class WeChatOfficialAccount implements Subject {
    private List<Observer> list;
    private String message;

    public WeChatOfficialAccount() {
        list = new ArrayList<>();
    }

    @Override
    public void addObserver(Observer o) {
        list.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        if (!list.isEmpty()) {
            list.remove(o);
        }
    }

    @Override
    public void notifyObserver() {
        for (Observer observer : list) {
            observer.update(message);
        }
    }

    public void setInfo(String a) {
        this.message = a;
        log.info("微信公众号更新,新发布一篇文章:" + a);
        notifyObserver();
    }
}

3、抽象观察者(Observer)

代码语言:javascript
复制
public interface Observer {
    void update(String message);
}

4、具体观察者(WeChatUser)

代码语言:javascript
复制
@Slf4j
public class WeChatUser implements Observer {
    private String name;
    private String message;

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

    @Override
    public void update(String message) {
        this.message = message;
        log.info("用户:" + name + ", 收到订阅文章" + message);
    }
}

5、测试类(Main)

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) {
        WeChatOfficialAccount weChatOfficialAccount = new WeChatOfficialAccount();

        weChatOfficialAccount.addObserver(new WeChatUser("user1"));
        weChatOfficialAccount.addObserver(new WeChatUser("user2"));

        weChatOfficialAccount.setInfo("《微服务架构》");
    }
}

控制台输出:

代码语言:javascript
复制
微信公众号更新,新发布一篇文章:《微服务架构》
用户:user1, 收到订阅文章《微服务架构》
用户:user2, 收到订阅文章《微服务架构》

三、总结

1、优点

  • 解耦性:主题和观察者之间是松耦合的,它们可以独立地进行扩展和修改。
  • 可重用性:可以方便地添加新的观察者来扩展功能。
  • 灵活性:主题和观察者之间的通信是动态的,可以在运行时添加或删除观察者。

2、缺点

  • 更新顺序:观察者的更新顺序是不确定的,可能导致一些问题。

3、应用场景

事件处理、图形用户界面(GUI)、订阅发布消息。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、实例
    • 1、抽象被观察者(Subject)
      • 2、具体被观察者(WeChatOfficialAccount)
        • 3、抽象观察者(Observer)
          • 4、具体观察者(WeChatUser)
            • 5、测试类(Main)
            • 三、总结
              • 1、优点
                • 2、缺点
                  • 3、应用场景
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档