观察者模式

title

观察者模式(Observer Pattern)是一种行为型设计模式,用于实现对象间的发布-订阅机制,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

观察者模式中包含以下角色:

  • 抽象主题(Subject):定义了被观察者对象的接口,包含了添加、删除和通知观察者的方法。
  • 具体主题(ConcreteSubject):实现了抽象主题的接口,保存了观察者列表,并在状态发生变化时通知所有观察者。
  • 抽象观察者(Observer):定义了观察者的接口,包含了更新方法。
  • 具体观察者(ConcreteObserver):实现了抽象观察者的接口,在被观察者状态发生变化时接收通知并进行更新。

以下是观察者模式的一个简单示例,假设有一个微信公众号类(WeChatAccount),包含了关注、取消关注和发送消息的方法。使用观察者模式,可以让所有关注该公众号的用户(Observer)都能够收到发送的消息。

Subject.java:

import java.util.ArrayList;
import java.util.List;

public abstract class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

ConcreteSubject.java:

public class WeChatAccount extends Subject {
    private String name;

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

    public String getName() {
        return name;
    }

    public void publish(String message) {
        System.out.println("公众号:" + name + " 发布了一条消息:" + message);
        notifyObservers(message);
    }
}

Observer.java:

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

ConcreteObserver.java:

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 Main {
    public static void main(String[] args) {
        WeChatAccount weChatAccount = new WeChatAccount("Java之路");
        User user1 = new User("张三");
        User user2 = new User("李四");

        weChatAccount.attach(user1);
        weChatAccount.attach(user2);

        weChatAccount.publish("Java新特性");

        weChatAccount.detach(user2);

        weChatAccount.publish("Spring Boot 教程");
    }
}

在上述代码中,WeChatAccount 是具体主题,User 是具体观察者。当使用 weChatAccount.publish() 发布一条消息时,所有关注该公众号的用户都可以收到消息。

powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:01

results matching ""

    No results matching ""