原创

设计模式之观察者模式

作者:cndz 围观群众:681 更新于 标签:设计模式观察者模式观察模式简介

简介

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,它的所有依赖者都会收到通知并且自动更新。

观察者模式的核心思想是将观察者和主题对象分离,让它们各自独立地变化和扩展,从而实现松散耦合。当主题对象的状态发生变化时,它会通知所有的观察者对象,并且观察者对象能够实时地获取到最新的状态信息。

观察者模式的实现方式有两种:基于接口和基于事件。

优缺点

观察者模式的优点在于:

  • 松散耦合:主题对象和观察者对象之间松散耦合,它们之间仅仅是依赖关系,主题对象不需要知道观察者的具体实现。
  • 可重用性:可以方便地增加和删除观察者对象,而且不会影响到主题对象和其他观察者对象之间的交互。
  • 实时性:当主题对象状态发生变化时,观察者对象能够实时地收到通知。

观察者模式的缺点在于:

  • 会增加对象的数量:如果一个主题对象有很多的观察者对象,那么就会有很多的对象在同时工作,这样会占用大量的系统资源。
  • 通知顺序不确定:观察者之间的通知顺序是不确定的,这会导致一些问题的发生。

Java实例

下面是一个简单的Java实例,展示了如何使用观察者模式。

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

// 主题对象
class Subject {
    private List<Observer> observers = new ArrayList<Observer>();
    private int state;

    public int getState() {
        return state;
    }

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

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

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

// 观察者对象
abstract class Observer {
    protected Subject subject;

    public abstract void update();
}

class BinaryObserver extends Observer {
    public BinaryObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
    }
}

class OctalObserver extends Observer {
    public OctalObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
    }
}

class HexObserver extends Observer {
    public HexObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Hex String: " + Integer.toHexString(subject.getState()));
    }
}

// 测试类
public class ObserverPatternDemo {
    public static void main(String[] args) {
        Subject subject = new Subject();
        new BinaryObserver(subject);
        new OctalObserver(subject);
        new HexObserver(subject);

        System.out.println("First state change: 15");
        subject.setState(15);
        System.out.println("Second state change: 10");
        subject.setState(10);
    }
}

应用场景

观察者模式在很多地方都有应用,比如:

  • Java AWT和Swing框架中的事件处理机制。
  • Android开发中的广播机制。
  • Web开发中的监听器(Listener)机制。

观察者模式的应用场景主要包括以下几个方面:

  • 对象状态的变化需要及时通知其他对象,并且这些对象之间的关系比较复杂,不希望耦合度太高。
  • 当一个对象的改变需要同时改变其他对象,而且不知道具体有多少对象需要改变。
  • 一个对象必须通知其他对象,但是你又希望这个对象和其他被通知的对象是松散耦合的。

总结

观察者模式是一种非常实用的设计模式,它可以帮助我们实现对象之间的松散耦合,提高代码的可重用性和实时性,同时也存在一些缺点需要注意。在实际的开发过程中,我们需要根据具体的业务场景来选择合适的设计模式。

最后,观察者模式是一种经典的设计模式,掌握它可以让我们更好地理解面向对象编程的思想,提高代码的质量和可维护性,是每个Java程序员必学的设计模式之一。