返回

一招鲜吃遍天,观察者与订阅发布模式全面剖析

前端

密切关注,实时掌握:观察者模式

想象一下一个繁忙的新闻编辑室,记者争分夺秒地报道突发新闻。为了确保所有记者都能立即获得最新消息,编辑室采用了观察者模式。

观察者模式是一种设计模式,让对象(观察者)订阅并接收来自其他对象(发布者)的通知。当发布者的状态发生变化时,它会通知所有观察者,使它们可以相应地更新自己的状态或执行特定操作。

观察者模式的优势:

  • 解耦发布者和观察者: 观察者模式使发布者和观察者之间保持松散耦合,便于独立开发和维护。
  • 可重用性高: 观察者可以轻松订阅多个发布者,提高代码可重用性。
  • 可扩展性强: 可以轻松添加或删除观察者,提高代码可扩展性。

代码示例:

// 发布者类
public class NewsPublisher {

    private List<NewsObserver> observers = new ArrayList<>();

    public void addObserver(NewsObserver observer) {
        observers.add(observer);
    }

    public void removeObserver(NewsObserver observer) {
        observers.remove(observer);
    }

    public void publishNews(String news) {
        for (NewsObserver observer : observers) {
            observer.update(news);
        }
    }
}

// 观察者类
public interface NewsObserver {

    void update(String news);
}

// 具体观察者类
public class Reporter implements NewsObserver {

    @Override
    public void update(String news) {
        System.out.println("Reporter: " + news);
    }
}

// 使用观察者模式
public class Main {

    public static void main(String[] args) {
        NewsPublisher publisher = new NewsPublisher();
        Reporter reporter1 = new Reporter();
        Reporter reporter2 = new Reporter();

        publisher.addObserver(reporter1);
        publisher.addObserver(reporter2);

        publisher.publishNews("Breaking news: A new virus discovered!");
    }
}

灵活沟通,实时传递:订阅发布模式

现在,想象一个国际会议,各国代表需要随时了解最新进展。为了实现实时通信,会议采用订阅发布模式。

订阅发布模式是一种设计模式,允许对象(订阅者)订阅并接收来自其他对象(发布者)发布的消息。发布者和订阅者之间松散耦合,这意味着它们不需要知道彼此的存在。

订阅发布模式的优势:

  • 解耦发布者和订阅者: 订阅发布模式使发布者和订阅者之间保持松散耦合,便于独立开发和维护。
  • 可重用性高: 订阅者可以轻松订阅多个发布者,提高代码可重用性。
  • 可扩展性强: 可以轻松添加或删除订阅者,提高代码可扩展性。
  • 实时通信: 发布者可以立即将消息发送给所有订阅者,实现实时通信。

代码示例:

// 发布者类
public class MessageBroker {

    private Map<String, List<MessageSubscriber>> subscribers = new HashMap<>();

    public void publishMessage(String topic, String message) {
        List<MessageSubscriber> subscribers = this.subscribers.get(topic);
        if (subscribers != null) {
            for (MessageSubscriber subscriber : subscribers) {
                subscriber.receiveMessage(topic, message);
            }
        }
    }

    public void subscribe(String topic, MessageSubscriber subscriber) {
        List<MessageSubscriber> subscribers = this.subscribers.get(topic);
        if (subscribers == null) {
            subscribers = new ArrayList<>();
            this.subscribers.put(topic, subscribers);
        }
        subscribers.add(subscriber);
    }

    public void unsubscribe(String topic, MessageSubscriber subscriber) {
        List<MessageSubscriber> subscribers = this.subscribers.get(topic);
        if (subscribers != null) {
            subscribers.remove(subscriber);
        }
    }
}

// 订阅者类
public interface MessageSubscriber {

    void receiveMessage(String topic, String message);
}

// 具体订阅者类
public class Delegate implements MessageSubscriber {

    @Override
    public void receiveMessage(String topic, String message) {
        System.out.println("Delegate: " + message);
    }
}

// 使用订阅发布模式
public class Main {

    public static void main(String[] args) {
        MessageBroker broker = new MessageBroker();
        Delegate delegate1 = new Delegate();
        Delegate delegate2 = new Delegate();

        broker.subscribe("news", delegate1);
        broker.subscribe("sports", delegate2);

        broker.publishMessage("news", "Breaking news: A new virus discovered!");
        broker.publishMessage("sports", "Sports update: Local team wins championship!");
    }
}

选择合适的模式,打造高性能系统

观察者模式和订阅发布模式都是非常有用的设计模式,具体选择哪种模式取决于项目的需求。

  • 简单通信: 观察者模式是让对象相互通信的一种简单而有效的方法。
  • 灵活通信: 订阅发布模式更灵活,支持实时通信。

无论您选择哪种模式,了解和使用它们都可以帮助您创建更灵活、更可维护和更可扩展的软件系统。

常见问题解答:

  1. 什么时候使用观察者模式?
    当需要让对象订阅并接收来自其他对象的状态变化时。

  2. 什么时候使用订阅发布模式?
    当需要让对象订阅并接收来自其他对象发布的消息,且需要实时通信时。

  3. 观察者模式和订阅发布模式有什么区别?
    订阅发布模式更灵活,允许发布者发布消息,而观察者模式只允许发布者更新自己的状态。

  4. 如何解耦发布者和订阅者?
    通过使用观察者模式或订阅发布模式,让发布者和订阅者松散耦合。

  5. 如何提高代码的可重用性?
    通过使用观察者模式或订阅发布模式,让订阅者可以轻松订阅多个发布者。