二十四:观察者模式:信息的传递者

a. 探寻观察者模式的奥义

观察者模式是一种行为设计模式,允许一个对象(被称为主题或可观察者)维护一个依赖对象列表(被称为观察者),当主题的状态发生变化时,所有观察者都会得到通知。观察者模式主要解决了对象之间的松耦合问题,使得一个对象的变化不会影响其他依赖它的对象。

b. 亲身体验:观察者模式实现

首先,我们需要创建一个主题接口,定义注册、注销和通知观察者的方法:

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

接下来,创建一个观察者接口,定义更新状态的方法:

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

然后,实现主题接口,具体的主题类可以根据需求进行扩展:

public class ConcreteSubject implements Subject {
    private List<Observer> observers;
    private String message;

    public ConcreteSubject() {
        observers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

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

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

    public void setMessage(String message) {
        this.message = message;
        notifyObservers();
    }
}

最后,实现观察者接口:

public class ConcreteObserver implements Observer {
    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(name + " received: " + message);
    }
}

现在,我们可以创建主题和观察者实例,并将观察者注册到主题上:

public class Main {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver("Observer 1");
        Observer observer2 = new ConcreteObserver("Observer 2");

        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        subject.setMessage("Hello, Observers!");
    }
}

c. 优缺点探讨:观察者模式的影响

优点:

1、松耦合:主题和观察者之间的依赖关系减弱,使得它们可以独立地进行修改和扩展。
2、动态关联:可以在运行时动态地添加或删除观察者,提高了系统的灵活性。

缺点:

1、通知效率:当主题有大量观察者时,通知的过程可能会耗费较长时间可能引发无限循环:如果观察者和主题之间存在循环依赖,可能导致无限循环,需要特别注意处理。

d. 观察者模式在开源框架中的应用

观察者模式在许多开源框架和库中得到了广泛应用。以下是一些典型的例子:
Java内置观察者模式支持:Java自带了java.util.Observable类和java.util.Observer接口,可以直接使用它们来实现观察者模式。
Android框架中的LiveData:LiveData是一个数据持有类,允许在其数据发生变化时通知观察者。它在Android架构组件库中作为观察者模式的实现被广泛使用。
Spring框架中的ApplicationEvent和ApplicationListener:Spring框架使用ApplicationEvent和ApplicationListener来实现事件驱动的观察者模式。开发者可以通过自定义事件和监听器来实现松耦合的系统架构。
RxJava:RxJava是一个基于响应式编程的Java库,它实现了观察者模式,并提供了丰富的操作符来处理异步数据流。它广泛应用于Android、后端服务等场景。

总结:

观察者模式是一种非常实用的设计模式,它解决了对象之间的松耦合问题,使得一个对象的状态变化不会直接影响到其他依赖它的对象。在实际开发中,观察者模式可以帮助我们构建灵活、可扩展的系统。同时,也要注意观察者模式的一些缺点,并尽可能地进行优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值