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

2023-07-31 08:38:55 浏览数 (2)

软件设计模式(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)、订阅发布消息。

0 人点赞