当前位置: 首页 > news >正文

Android设计模式之观察者模式

一、定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

二、核心角色:

        Subject:抽象主题被观察的角色,管理观察者集合,提供注册/注销方法,定义通知逻辑。

        ConcreteSubject:具体主题,存储具体状态数据,状态变更时触发通知。

        Observer:抽象观察者,定义更新接口,使得主题状态发生变化时更新自己。

        ConcreteOberver:具体观察者,实现抽象观察者的更新接口,以便主题状态发生变化时更新自身状态。

三、简单代码示例:

// 观察者接口
public interface Observer {
    void update(String message);
}

// 被观察者抽象类
public abstract class Subject {
    private List<Observer> observers = new ArrayList<>();

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

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

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

// 具体被观察者(如网络请求模块)
public class NetworkManager extends Subject {
    public void onDataReceived(String data) {
        notifyObservers(data); // 数据到达时通知观察者
    }
}

// 具体观察者(如UI组件)
public class UIComponent implements Observer {
    @Override
    public void update(String message) {
        Log.d("ObserverDemo", "更新UI:" + message);
    }
}


NetworkManager manager = new NetworkManager();
manager.attach(new UIComponent());
manager.onDataReceived("新数据"); // 触发UIComponent的update()
 

四、Android中的应用场景

1.事件驱动机制:按钮点击监听,ListView或RecyclerView的Adapter通过notifyDataSetChanged()通知视图刷新,BroadcastReceiver。

2.数据绑定与状态同步:ContentObserver监听数据库变化,LiveData实现数据驱动UI更新

3.跨模块通信:EventBus,RxBus

五、优缺点:

优点

        解耦性强:被观察者无需了解具体观察则细节,仅依赖接口。

        扩展灵活:可动态增删观察者,支持多级事件触发。

缺点

        性能损耗:大量观察者或高频通知会引发性能问题。

        潜在内存泄漏:需要注意观察者生命周期,避免持有无效引用。

相关文章:

  • 【IntelliJ IDEA导出WAR包教程】
  • 设计模式-领域模式
  • 享元模式介绍
  • Flutter完整开发实战详解(一、Dart语言和Flutter基础)
  • 当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系
  • Css环形旋转立体感动画
  • 【GNN】第五章:图神经网络架构中的基础设施——GCN、GAT、GraphSAGE、TopKPooling、GAP、GMP
  • AWTK-WEB 快速入门(6) - JS WebSocket 应用程序
  • 通过strApi5的导入导出功能 把sqlite数据转移到mysql
  • 用HTML和CSS生成炫光动画卡片
  • ctf-web:模板注入 -- Cyber Apocalypse CTF 2025 烈火试炼 Trial by Fire
  • Unity学习之Shader(Phong与Blinn-Phong)
  • Java Collection API增强功能系列之五 Map优雅处理键冲突与合并逻辑merge
  • Node.js从0.5到1学习计划
  • 使用Github项目nghttp3的样例学习HTTP/3
  • 新一代ITSM:燕千云重构企业智慧服务生态体系
  • 关于spark在yarn上运行时候内存的介绍
  • 计算机组成原理的学习day01
  • 【面试题】利用Promise实现Websocket阻塞式await wsRequest() 请求
  • 关于我对接了deepseek之后部署到本地将数据存储到mysql的过程
  • 在哪里创建网站/百度提问登陆入口
  • 搜索引擎营销的典型案例/苏州seo免费咨询
  • 做编程题的网站/推广网站文案
  • d0906网站建设与管理/宣传推广方案怎么写
  • 工具类网站做排名/游戏代理加盟平台
  • 公司开办流程/西安自动seo