设计模式之《观察者模式》

什么是观察者模式

观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

为什么用观察者模式

观察者模式可以方便地实现对象之间的松耦合,提高系统的可维护性和可扩展性。例如,当一个对象的状态发生变化时,我们可以通过观察者模式来避免紧耦合的代码,可以让多个观察者对象独立地对主题对象的状态变化做出响应。

工作中用在哪里

在Android开发中,观察者模式经常用在以下场景:

1)当用户点击一个按钮时,多个控件需要同时更新显示,此时可以使用观察者模式,让这些控件成为主题对象的观察者,当主题对象的状态发生变化时,通知观察者更新自己。

2)当用户需要实时获取某个数据时,可以将该数据作为主题对象,多个观察者监听该主题对象,当该数据发生变化时,主题对象通知所有观察者对象更新自己,这样可以实现实时更新数据。

3)当用户需要实现事件总线的功能时,可以使用观察者模式,通过注册观察者来监听事件的发生,当事件发生时,通知所有观察者处理相应的逻辑。

设计思路

在观察者模式中,主要包含以下几个角色:

1)抽象主题:定义了主题对象的接口,其中包含了添加、删除、通知观察者的方法。

2)具体主题:实现了抽象主题的接口,同时保存了观察者列表,并在状态发生变化时,通知所有观察者。

3)抽象观察者:定义了观察者的接口,其中包含了更新自己的方法。

4)具体观察者:实现了抽象观察者的接口,具体实现自己的更新逻辑。

观察者模式的代码实现

以观察者模式实现事件总线为例,代码实现如下:
1、抽象主题

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

2、具体主题

public class EventBus implements Subject{
    
    
    private List<Observer> observerList = new ArrayList<>();
    
    @Override
    public void registerObserver(Observer observer) {
    
    
        observerList.add(observer);
    }

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

    @Override
    public void notifyObservers(Object obj) {
    
    
        for (Observer observer : observerList) {
    
    
            observer.update(obj);
        }
    }
}

3、抽象观察者

public interface Observer {
    
    
    void update(Object obj);
}

4、具体观察者

public class MainObserver implements Observer {
    
    

    public MainObserver(Subject subject) {
    
    
        subject.registerObserver(this);
    }

    @Override
    public void update(Object obj) {
    
    
        //处理逻辑
    }
}

5、使用示例

EventBus eventBus = new EventBus();
MainObserver mainObserver = new MainObserver(eventBus);
//事件发生时,通知所有观察者
eventBus.notifyObservers(obj);

总结

观察者模式是一种常用的设计模式,它可以实现对象之间的松耦合,提高系统的可维护性和可扩展性。在Android开发中,观察者模式经常用于实现事件总线、多控件协作等功能。通过学习观察者模式,我们可以更好的理解面向对象设计的思想和原则,提高我们的设计水平和编码能力。

猜你喜欢

转载自blog.csdn.net/weixin_45112340/article/details/130005165