返回

简单实现观察者模式和发布订阅模式,提升编程设计的灵活性和可扩展性

前端

近年来,面向对象编程(OOP)已成为软件开发的基石。OOP强调将数据和行为封装在对象中,从而提高代码的可重用性和可维护性。其中,观察者模式和发布订阅模式作为重要的设计模式,在OOP中发挥着至关重要的作用。本文将对这两种模式进行简要介绍,并通过代码示例进行详细说明,帮助您理解其原理并将其应用于实际项目中。

观察者模式

观察者模式是一种设计模式,它允许一个对象(称为“主题”或“可观察对象”)在状态发生变化时通知其依赖对象(称为“观察者”或“订阅者”)。观察者模式的主要优点在于:

  • 灵活性: 观察者模式允许观察者在不了解主题的具体实现的情况下对其进行观察。这使得主题和观察者可以独立地进行更改和扩展,从而提高了代码的灵活性和可扩展性。
  • 可扩展性: 观察者模式允许在不修改现有代码的情况下向系统添加新的观察者。这使得系统能够轻松地适应新的需求和变化。
  • 松耦合: 观察者模式将观察者与主题解耦,从而提高了代码的可维护性和可测试性。

观察者模式的经典实现如下:

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

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

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

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

class Observer {
    public void update() {
        // Do something when the subject changes.
    }
}

class ConcreteSubject extends Subject {
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }
}

class ConcreteObserverA extends Observer {
    @Override
    public void update() {
        System.out.println("ConcreteObserverA: The subject's state has changed to " + subject.getState());
    }
}

class ConcreteObserverB extends Observer {
    @Override
    public void update() {
        System.out.println("ConcreteObserverB: The subject's state has changed to " + subject.getState());
    }
}

public class Main {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserverA observerA = new ConcreteObserverA();
        ConcreteObserverB observerB = new ConcreteObserverB();

        subject.addObserver(observerA);
        subject.addObserver(observerB);

        subject.setState(1);
        subject.setState(2);
        subject.setState(3);
    }
}

发布订阅模式

发布订阅模式是一种设计模式,它允许对象(称为“发布者”)将事件或消息发布到通道(称为“主题”或“总线”),而其他对象(称为“订阅者”)可以订阅这些通道并接收这些事件或消息。发布订阅模式的主要优点在于:

  • 松耦合: 发布订阅模式将发布者与订阅者解耦,从而提高了代码的可维护性和可测试性。
  • 可扩展性: 发布订阅模式允许在不修改现有代码的情况下向系统添加新的发布者和订阅者。这使得系统能够轻松地适应新的需求和变化。
  • 异步通信: 发布订阅模式支持异步通信,即发布者和订阅者可以独立于彼此运行。这使得系统能够提高性能并处理高并发的情况。

发布订阅模式的经典实现如下:

class PubSub {
    private Map<String, List<Subscriber>> subscribers = new HashMap<>();

    public void publish(String topic, Object message) {
        List<Subscriber> subscribers = this.subscribers.get(topic);
        if (subscribers != null) {
            for (Subscriber subscriber : subscribers) {
                subscriber.onMessage(message);
            }
        }
    }

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

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

interface Subscriber {
    void onMessage(Object message);
}

class ConcreteSubscriberA implements Subscriber {
    @Override
    public void onMessage(Object message) {
        System.out.println("ConcreteSubscriberA: Received message: " + message);
    }
}

class ConcreteSubscriberB implements Subscriber {
    @Override
    public void onMessage(Object message) {
        System.out.println("ConcreteSubscriberB: Received message: " + message);
    }
}

public class Main {
    public static void main(String[] args) {
        PubSub pubSub = new PubSub();

        ConcreteSubscriberA subscriberA = new ConcreteSubscriberA();
        ConcreteSubscriberB subscriberB = new ConcreteSubscriberB();

        pubSub.subscribe("topic1", subscriberA);
        pubSub.subscribe("topic2", subscriberB);

        pubSub.publish("topic1", "Hello world!");
        pubSub.publish("topic2", 123);
    }
}

总结

观察者模式和发布订阅模式都是重要的设计模式,它们在软件开发中有着广泛的应用。观察者模式适用于需要通知多个对象时的情况,例如,当一个对象的状态发生变化时,需要通知其相关的对象进行更新。发布订阅模式适用于需要进行事件或消息通信的情况,例如,当一个对象发生某个事件时,需要通知其他对象进行处理。