Android设计模式:Observer观察者模式在Android中的应用,反向控制

设计模式与软件体系结构:从期末考题到工程实践的跃迁 设计模式与软件体系结构是面向对象系统构建的核心方法论,其本质是在复杂性中实现可维护、可演进、可扩展的架构决策。它源于对重复问题的抽象总结,依托封装、继承、多态等基础机制,通过职责分离、松耦合、开闭原则等原理指导代码组织。技术价值在于将隐性经验显性化为可复用、可验证、可协作的工程语言,显著降低需求变更带来的重构成本与线上缺陷率。典型应用场景覆盖电商支付策略动态切换、IoT设备状态通知解耦、微服务边界划分、MVC分层职责收敛及高并发架构权衡等真实开发现场。本文聚焦设计模式与软件体系结构在期末复习与工业落地之间的 阅读详情

高凝聚,低耦合-----箴言-----

内容简介:

反向控制(Inversion of Control,缩写为IoC),也称控制反转。是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。
通过反向控制,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

面向对象的设计目的之一就是高凝聚,低耦合。反向控制作为一种设计原则,尽可能地实现低耦合的目的。

1. Android Framework的反向控制

在Android系统中,到处可以看到反向控制的体现。不夸张地说,反向控制是Android应用框架(Application Framework,即AF)魅力的源泉。其常见的实现有:

  1) 继承(Inheritance)

---- 这与Template Method模式关系密切。

  2)委托(Delegation)

---- 这与Observer模式密切相关。

反向控制是一种机制,其具体体检在继承和委托。而继承和委托,又可以在设计模式中找到具体的体现。这样一来,这些概念就和代码联系起来了。
  
  在Android系统中,包括Framework层和Application,反向控制机制处处可见。
。这两种机制的具体体现,可以很容易对应到Template Method和Observer模式。反过来,通过对设计模式的运用,也能更加深刻体会到这些机制的真正含义。这样,除了更能活用Android之外,也能逐渐提升个人在程序设计,设计模式,架构方面的构建能力。同时,也更容易读懂别人的代码。


  2. 复习:使用继承(Template Method模式来实现)

   面向对象中,封装,继承,多态这些特性,都是一些逻辑概念,这些概念都可以有一些具体体现,例如:
   封装:类和对象;
   继承:在Template Method设计模式,很好的体现了继承这个概念。
   多态:方法重载。


   下面,先复习一下Java中的Template Method设计模式。

// Student.java

public class Student {
           private String m_name;

           private int m_credit;

           Student(String na, int cr ){
                     m_name = na;

                     m_credit = cr;

           }

           public void print(){
                     System.out.println(m_name + ",  " +String.valueOf(template_computeTuition()));

           }

    public float template_computeTuition() {
                        if (m_credit > 6)  m_credit = 6;  

                        return hook_getValue(m_credit) + 5000;

            }

    protected float hook_getValue(int credit){
       return (credit -1) * 500;

    }

}

// Graduate_Student.java

public class Graduate_Student extends Student{
           Graduate_Student(String na, int cr ){
                     super(na, cr);

           }

           protected float hook_getValue(int credit){
                   return credit * 700;

           }

} 

// Undergraduate_Student.java

public class Undergraduate_Student extends Student {
           Undergraduate_Student(String na, int cr ){
                     super(na, cr);

           }

}

//测试主程序代码: JMain.java

public class JMain {
           public static void main(String[] args) {
    int credit = 5;

           Graduate_Student mike = new Graduate_Student("Mike", 5);

           mike.print();

           Undergraduate_Student linda = new Undergraduate_Student("Linda", 7);

           linda.print();

}

}

说明:
这是以Template Method设计模式来实现反向控制。

3.使用委托(即Observer设计模式来实现)

  在Template Method设计模式中,hook method的具体实现是在子类中。使用委托时,则将hook method定义在独立的类中,如下述的HookClass:
 

//把hook method定义在独立的类中:

// HookClass.java

public class HookClass {
              protected float getValue(int credit){
                  return (credit -1) * 500;

               }

}

//template method委托HookClass类的实例去处理定制化(可变)部分:

// Student.java

public class Student {
           private String m_name;

           private int m_credit;

           private HookClass hookObject = null;

           Student(String na, int cr ){
                     m_name = na;

                     m_credit = cr;

           }

           public void setHook(HookClass hk){
                     hookObject = hk;

           }

           public void print(){
                     System.out.println(m_name + ",  " +String.valueOf(template_computeTuition()));

           }

    public float template_computeTuition() {
                        if (m_credit > 6)  m_credit = 6;  

                        return hookObject.getValue(m_credit) + 5000;

            }

}

//定义HookClass的子类:GraduateHook,并且让Student类的实例委托给GraduateHook子类的实例:

// Graduate_Student.java

public class Graduate_Student extends Student{
           Graduate_Student(String na, int cr ){
                     super(na, cr);

                     setHook(new GraduateHook());

           }

           private static class GraduateHook extends HookClass{
                     @Override

                     protected float getValue(int credit){
                             return credit * 700;

                     }

           }

}        

// JMain.java

public class JMain {
           public static void main(String[] args) {
     int credit = 5;

     Student mike = new Graduate_Student("Mike", credit);

           mike.print();

 }

}

 

说明:

这样一来,,Student类的template method 就调用了HookClass抽象类的getValue(),进而反向调用到GraduateHook类的getValue()方法。

4. Observer设计模式的Listener代码实现:

Observer设计模式又称为Listener模式,这样,大家理解了吧,不要说,没有用过Listener啊。

用Listener方式,上面的例程可以改写为:

 


// IListener.java

public interface IListener {
           float getValue(int credit);

}

// Student.java

public class Student {
           private String m_name;

           private int m_credit;

           private IListener plis = null;

           Student(String na, int cr ){
                     m_name = na;

                     m_credit = cr;

           }

           public void setListener(IListener lis){
                     plis = lis;

           }

           public void print(){
                     System.out.println(m_name + ",  " +String.valueOf(template_computeTuition()));

           }

    public float template_computeTuition() {
                        if (m_credit > 6)  m_credit = 6;  

                        return plis.getValue(m_credit) + 5000;

            }

 }

// Graduate_Student.java

public class Graduate_Student extends Student{
           Graduate_Student(String na, int cr ){
                     super(na, cr);

                     setListener(new GraduateListener());

           }

           private static class GraduateListener implements IListener{
 

                     public float getValue(int credit) {
                                return credit * 700;

                     }

           }        

}

// JMain.java

public class JMain {
           public static void main(String[] args) {
     int credit = 5;

     Student mike = new Graduate_Student("Mike", credit);

           mike.print();

 }

}


 

 

5. 欣赏Android中的Observer设计模式(用Listener实现):

  程序范例代码:

package com.test.myapp.ui;


// MyMainActivity.java


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import com.test.myapp.ui.R;


public class MyMainActivity extends Activity {

    @Override


    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        setContentView(R.layout.main);

        Button btn = (Button) findViewById(R.id.button);

        Button btn2 = (Button) findViewById(R.id.button2);

        btn.setBackgroundResource(R.drawable.gray);

        btn.setOnClickListener(clickListener);

        btn2.setBackgroundResource(R.drawable.byw);

        btn2.setOnClickListener(clickListener_2);

    }


    OnClickListener clickListener = new OnClickListener() {
        public void onClick(View v) {
            String name = ((Button) v).getText().toString();

            setTitle(name + " button clicked");

        }

    };


    OnClickListener clickListener_2 = new OnClickListener() {
        public void onClick(View v) {
            finish();

        }

    };


}

说明:
    这个例程,体现了Android中的Listener设计模式:

   这里的MyActivity就是ConcreteObserver;而onClick()就是hook method(或称为primitive method)。

  View就是Subject。而Button则是ConcreteSubject。

 

 


 

android Observer(观察者模式)_案例祥解.pdf 立即下载

相关推荐

华为Watch的ECG功能技术分析

华为Watch的ECG(心电图)功能通过硬件传感器、算法优化和医疗认证的结合,实现了对心脏电活动的监测和房颤(AFib)等心律失常的预警。采用医疗级ECG模拟前端芯片(AFE),如TI(德州仪器)的ADS1292R等,支持低噪声、高采样率(通常≥200Hz)。结合PPG(光学心率)数据交叉验证,提高检测可靠性(如ECG和PPG心率不一致时触发警告)。通过RR间期变异性判断心律是否规则,识别房颤(AFib)的典型特征(如不规则不规则心律)。结合加速度计数据,识别手臂运动导致的信号失真,动态调整算法参数。

xu_wenming的博客 6441

Android 观察者模式(OBSERVER)应用详解

在现代Java编程中,更推荐使用自定义接口和类实现观察者模式,因为已被标记为过时。观察者模式的设计初衷主要在于解决对象之间的耦合问题,允许动态依赖关系,并自动通知依赖对象进行更新。这些特性使得观察者模式在需要松耦合、动态依赖和自动更新的场景中非常有用。然而,开发者在使用观察者模式时,也需要注意内存泄漏、性能开销等问题,采取适当的优化措施,如使用弱引用和异步通知,来提升系统的健壮性和效率。通过合理使用观察者模式,可以使系统更加灵活、可维护性更高,并且能够有效地响应变化。

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 1万+

Pycharm环境配置完整教程

本文主要介绍python解释器安装、Pycharm环境配置以及运行第一个程序的零基础的教程,即使是python小白也能正确配置相应的python学习环境哦!

悠眠小虫的博客 2万+

Android 常用的设计模式 六 (Observer(观察者)模式)

Observer 模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,所有的观察者对象都能够收到通知并更新自己。在 Android 开发中,Observer 模式通常用于实现数据的观察和更新,比如实现列表数据的实时更新、实现用户登录状态的同步等。

cejqjm的博客 1617

GNSS-RTK/INS紧组合里,那个‘杆臂改正’到底怎么算?一个公式讲清INS与天线位置的关系

本文深入解析GNSS-RTK/INS紧组合导航系统中的杆臂改正(Lever Arm Correction)原理与实现方法。详细介绍了杆臂效应的物理本质、数学建模及误差扰动分析,揭示了IMU与GNSS天线位置关系的核心公式,并提供了工程实现中的常见误区与验证方法。通过Python代码示例和紧组合量测模型处理流程,帮助开发者准确理解并应用这一关键技术。

weixin_33137081的博客 356

Android MediaCodec学习笔记

模块介绍 基本概念 OpenMAX是Khronos Group提出的标准,目标在于创造一个统一的接口,加速大量多媒体资料的处理。OpenMAX分成三层:应用层(Application Layer, AL), 整合层(Integration Layer, IL) 以及开发层(Development Layer, DL)。 OpenMAX (Open Media Acceleration) OpenMAX AL Application Layer ..

kisshine 2358

android 观察者(observer)模式

android 观察者(observer)模式 观察者模式 被观察者调用观察者的回调方法,实现被观察者向观察者的事件传递 接口回调 是观察者模式的一种实现方式,属于观察者模式(接口回调在实际运用中只有一个观察者)RxJava观察者模式: Observable (被观察者) Observer (观察者) subscribe (订阅) event (事件)

keen_zuxwang的博客 5878

蓝牙抓包实战:用nrf52840和Wireshark解析广播包与SCAN_RSP的完整流程

本文提供了一份完整的蓝牙抓包实战指南,详细介绍了如何使用nRF52840 Dongle和Wireshark捕获并解析蓝牙广播包与SCAN_RSP。内容涵盖环境搭建、广播事件分析、数据包结构拆解以及常见连接问题的调试技巧,旨在帮助开发者和物联网工程师深入理解BLE底层通信,提升硬件调试能力。

weixin_29279153的博客 494

Android开发-设计模式-观察者模式(Observer)

观察者模式是对象的行为模式,又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或者从属模式(Dependents)模式

City_Coder的博客 656

当AI写小说——一个被严重低估的工程化战场

摘要 AI小说创作远非简单的prompt生成,而是一项需要系统化工程管理的复杂任务。本文通过真实案例分析,揭示了当前AI写小说存在的五大核心难题:设定一致性难以维持、文风控制缺乏个性、爽感节奏难以把握、长篇记忆能力有限以及平台规则适配困难。研究显示,90%的失败案例源于错误的创作方法,主要表现为对话框式随机生成和模板式同质化创作。要实现高质量的AI小说创作,必须建立包括设定治理、记忆管理、文风校准等在内的全链路工程化体系,而非依赖单一prompt指令。只有采用系统化的人机协同方法,才能突破当前AI创作的质量

sellyogurt的博客 680

自己的搭建的slam机器人建图导航测试

1、前言 这里是对自己搭建的slam机器人建图导航的功能测试,原本并不想写这一篇的,因为每个小伙伴的需求都不一样,但是发现还是有同学有需求,于是就有了这一篇。本篇属于说明分享类文章,不涉及细节解释。按照步骤操作即可。 本次测试需要建图算法my_slam_gmapping、导航框架navigation、以及explore_lite功能包、mbot_teleop键盘控制功能包等。 环境:ubuntu mate 16.04 + ROS Kinetic 功能包下载:在公众号:小白学移动机器人,发送:建图导航测试,即

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 8700

Android框架设计模式(三)——Observer Method

在介绍观察者模式之前,先补充两个概念:IOC(控制反转)、DIP(依赖倒置)。依赖倒置(控制反转),是框架设计的核心,因为有了它们会产生框架,框架的核心就是把【不变】的留在框架层次,把【变化】的留在应用层次,然后两个层次之间通过接口来实现沟通,降低耦合。它们两者本质是同样的,只是一个是从原则上面描述,一个是从方式上面描述。

David-Kuper的专栏 5265

深入浅出讲解外部服务提供者 OAuth 2.0 帐户客户端创建与 ABAP 系统集成

本文详细介绍了在SAP ABAP平台配置OAuth 2.0客户端以安全调用外部Web服务的完整流程。主要内容包括:首先需要在外部服务提供者平台注册OAuth客户端,获取client ID和client secret;其次需特别注意重定向URI必须是公开可访问的地址;然后在ABAP系统中通过事务码OA2C_CONFIG配置OAuth客户端信息;最后阐述了常见的错误排查方法。文章强调了OAuth 2.0作为SAP系统与外部服务安全集成的标准协议,正确配置客户端是确保后续API调用安全可靠的关键前提。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1734

[设计模式]3. Observer

Observer

peiweioo的专栏 262

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 常用设计模式速查

文章整理了Android开发中常见技术点对应的设计模式,给出伪代码和典型使用位置,包括单例、Builder、工厂、观察者、适配器、代理、装饰器、外观、模板方法、策略、责任链、状态、命令、MVC/MVP/MVVM等。目的是帮助理解模式在Android中的实际应用。 摘要

trebleZ的博客 382

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android设计模式1

面向对象设计原则

爱因斯坦福的博客 1064

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

行为型设计模式全解析:YCBlogs 中 11 种对象交互模式的原理与实战

本文以 [YCBlogs](https://link.gitcode.com/i/2debd7a83a6e0d5d97005cb979df84af) 仓库中《行为型模式》导读文档为核心骨架,系统梳理行为型设计模式的定义、分类、适用场景,并逐一深入剖析职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者这 11 种模式。行为型模式回答的是"类与对象之间如何交互"这一核心

gitblog_00085的博客 223

Nexent SDK 工具开发指南:基于 smolagents 的 Tool 体系、消息观察者模式与最佳实践

Nexent SDK 围绕 `smolagents.tools.Tool` 基类构建了一套统一、可扩展的 Agent 工具体系,涵盖联网搜索、知识库检索、文件管理、终端执行、邮件、多模态理解、记忆读写与任务编排等能力。本文以 SDK 中现有工具为分析蓝本,系统梳理工具的分类、命名规范、核心属性、消息推送机制与代码模板,并结合 [tools_common_message.py](https://li

gitblog_00912的博客 950

23个设计模式一文搞懂

本笔记涵盖 23 种经典设计模式,按创建型、结构型、行为型三大类整理。每个模式配有生活类比、核心思想、结构图解、实现要点、真实应用案例、适用场景、优缺点分析及常见面试题。

weixin_72753562的博客 802

android 面试题

ContextImpl.startActivity → Instrumentation.execStartActivity → AMS.startActivity → 校验权限、创建 ActivityRecord、Pause 当前 Activity → ApplicationThread.scheduleTransaction → ActivityThread.H → LaunchActivityItem → performLaunchActivity(创建 Activity、调用 onCreate)。

qq_25657125的博客 395

设计模式复习:从场景识别到架构决策的实战指南

设计模式不是静态知识点,而是应对软件演化中‘变化点’与‘稳定点’的工程决策模板。其核心原理在于通过职责分离、依赖抽象和运行时解耦,实现开闭原则、单一职责等架构约束。技术价值体现在降低维护成本、支持快速迭代与团队协作,广泛应用于电商订单系统、日志扩展、UI主题切换、微服务拆分等真实场景。本文聚焦策略模式、观察者模式、工厂模式系列及MVC/MVVM分层思想,结合UML规范、线程安全单例、三层架构依赖约束等高频考点,帮你建立‘问题→模式→代码’的条件反射。

weixin_34290631的博客 379

Rxjava

本文只供参考学习,若有错误与不恰当之处,请谅解一下,感谢! 文章中涉及内容若有若有侵权,请联系删除 简介 Rxjava是一个综合异步和基于事件驱动编程的库Rxjava核心是异常数据流和响应式编程1.把事件(数据)看出一条河流,它可以被观察,过滤,操作,也可以和另一条河流汇合成新河流2.一旦事件产生或发生变化,就可以触发观察这些事件的角色(观察者/订阅者)做出响应处理Rxjava优势:1.具备响应式编程特性2.为异步而生,无需手动创建线程,并具备线程切换能力3.支持链式调用,保证代码的简洁性4.各种操作符,功

weixin_45367987的博客 1018

软件设计方法论:框架、模式语言与元模式的三维体系

软件设计方法论是构建高质量系统的核心指导原则,其本质在于平衡结构化约束与灵活性需求。框架作为基础架构骨骼,通过控制反转等机制强制执行最佳实践,典型如Spring框架的依赖注入和生命周期管理。模式语言则提供可复用的设计解决方案网络,例如观察者模式与反应器模式的组合能显著提升系统性能。元模式揭示更深层的设计规律,像熔断器与重试模式的协同能有效预防分布式系统雪崩。这些方法在电商秒杀、物联网等高并发场景中表现尤为突出,通过合理组合可实现99.95%以上的系统可用性。掌握框架约束、模式组合与元抽象的三维体系,是应对复

dawanai5802的博客 442

软件工程术语库:编码与设计篇,从概念到实战的完整梳理

在软件工程中,“编码”与“设计”常因一词多义引发误解:从字符编码、编码算法到代码编写,从设计模式、架构设计到UI/UX,同一术语在不同语境下指向截然不同的领域。掌握精确的术语边界,是提升工程判断力的基础。本文以编码规范、设计模式为核心,系统拆解字符编码实战、编码算法应用、工作流引擎、领域驱动设计等高频概念,并结合AI编码工具的发展,给出建立个人术语库的落地方法,帮助初学者与工程师在真实项目中快速定位问题、规避常见坑点,让术语真正成为协作与设计的基石。

weixin_34208185的博客 302

uBlock Origin 免费浏览器广告拦截器:请求还没发出就被拦下

打开一个新闻页,正文还没滚完,网络面板里已经滚出几十个第三方请求——广告、跟踪、挖矿脚本,一个接一个。uBlock Origin(uBO)是一款免费的浏览器广告拦截器,这些请求还没发出去,它就把路堵死了。 ## 一句话结论 uBlock Origin 免费、GPLv3 开源、装完默认就在拦,绝大多数人不需要碰任何配置,这就是它最大的卖点。 - 该用的人:每天开大量网页,想省流量、省加载时间,

gitblog_00494的博客 397

Java与Android开发面试题集锦

# JAVA基础题 ##1.JDK和JRE区别 JRE是java运行环境,有JRE只能运行java程序 JDK是java开发工具,包括java开发环境和java运行环境,有jdk可以运行java程序,同时也能开发java程序 注释方法:三种 // /* /** 多行注释与文档注释区别: 多行注释的内容不能用于生成一个开发者文档 而文档注释的内容可以生产一个开发者文档。 Java提供了哪几种...

qq_37914850的博客 215
上一篇: C++基础#11:C++经典书籍
下一篇: C++基础#12:多态性与虚函数,重载函数,纯虚函数
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值