基于BREW的松耦合设计初探

依赖注入实战指南:从设计模式到Spring框架应用 依赖注入(Dependency Injection,DI)是一种重要的软件设计模式,其核心原理是通过控制反转(IoC)将对象的创建和依赖关系的管理从类内部转移到外部容器。这一模式的技术价值在于实现组件间的松耦合,显著提升代码的可测试性和可维护性。在工程实践中,依赖注入广泛应用于构建可扩展的企业级应用、微服务架构以及需要严格单元测试的项目中。通过合理运用依赖注入,开发者可以避免紧耦合带来的代码僵化问题,例如在Spring框架中,通过构造函数注入或Setter注入等方式,能够有效管理复杂对象依赖关系。本文结合单 阅读详情

 

基于BREW的松耦合设计初探

毛晓冬 2007-10-19

 

一、    概述:

在进行模块/系统设计时,我们通常应该遵循“低耦合、高内聚”,“针对接口编程,不针对实现编程”等原则,这使得我们的设计可以被重用同时易于扩展和维护,可以抵抗“需求”的不断变化。BREW中,大量使用应用和扩展来实现各种功能,如果处理不当,会使得大量的这些对象耦合起来,整个系统将很难抵抗“变化”。本文就BREW系统中如何进行松耦合的设计进行初步的探究。

 

二、    Browser需求:

本文以Browser这样一个实际的模块作为例子来讲述各种方案的演变。我们假设Browser模块对外提供的通用的功能为:能够以默认方式启动(进Browser的主菜单界面),能够启动并直接加载主页,能够启动并直接加载客户指定的URL,能够启动并直接进入互动信箱,能够清空互动信箱,能够恢复出厂设置。

 

三、    Browser App处理一切的方案

我们的第一个方案是最“传统”的,一切都由Browser App来处理。方案框图如下:

 

 

 

 

 

在这种方案下,你可以看到一切都是“外界”直接和Browser App交互。在BREW中,最典型的实现是,其他应用都通过事件来得到Browser的服务,如上,App1通过事件的方式请求Browser启动,加载URL或者进入互动信箱。App2也利用事件的方式请求Browser模块清空互动信箱和恢复出厂设置,这里的双向箭头代表的是,可能App2需要得到一个操作的结果,那么Browser App还需要通过事件告知这个“结果”。

一切都是直接交互。

一切都是针对实现。

App1,App2和Browser紧紧的耦合在一起。相互之间必须知道对方的存在(CLSID)。

现在,我们来看看当需求变化后发生了什么。

假设某一天,市场部认为现在的Browser界面太难看,可操作性太差,所以“枪毙”了现有的这个应用提供商,他们找了另外一个有丰富经验的Browser开发商来替换这个应用。

针对上面的框图,也就是“变化”发生了。我们可以看到,当变化发生时,虽然变化的仅仅是Browser,但是我们的App1,App2不得不将原先与Old Browser的交互转而延伸到与NewBrowser的交互。

牵一发而动全身!

为什么会这样??

因为我们针对了实现编程。

我们没有将变化点封装起来。

 

四、    分离出Browser Extension的方案

对于上面的方案,有一点需要注意的是,清空互动信箱和恢复出厂设置可能仅仅是一种数据处理,或者说是逻辑处理,完全没有必要启动应用。启动应用会带来额外的开销。此时,我们可以将职责分离,将Browser模块的逻辑/数据操作单独封装成一个对象(对应BREW中就是Extension),Browser App本身采用组合的方式引用该对象来完成具体的逻辑/数据处理,而自身仅仅完成高层的UI处理。同时,Browser模块也利用该封装的对象对外提供一致的逻辑/数据处理。使得客户如果仅仅需要请求逻辑/数据服务时,无须将Browser App牵扯进来,去除不必要的开销。

 

更改后的方案如下面框图所示。

 

 

 

 

不过该方案的目的在于分离职责,将逻辑与UI分离,使得各自的变化不影响对方。其本质是使得Browser模块中的逻辑和UI解耦。

但是,该方案仍然没有解决客户和Browser模块间的耦合。因为客户仍然面对直接和“实现(CLSID)”的交互。所以一旦“需求”变化后,客户不得不再次面临“灾难”。

 

五、    使用MIME Type降低耦合的方案:

现在是时候该让客户(App1,App2)和实现(Browser模块)进行解耦了。基本的原则,仍然是必须面向接口编程,而不是面向实现。封装各自的变化,并在运行时才绑定双方,而不是编译时!对于BREW,MIME Type Handler是一个现成的很好的可被利用的机制。利用该机制,可以轻松的实现上面的“奢求”。我们先看一下方案框图吧:

 

 

 

 

利用MIME Type Handler机制,可以将一个对象(实现)与一个MIME Type绑定(注册)。而客户对于具体对象(实现)的请求,现在改为向MIME Type Manager的请求,委托MIME Type Manager来与真正的对象(实现)交互,或者委托MIME Type Manager返回一个运行时的具体(实现)对象给客户的抽象接口。 BREW的MIME Type机制,就好像是一堵墙,隔离了客户和具体的实现对象,只要事先遵循一组事先约定的规约(接口,这里就是MIME Type),双方就可以单独的变化,而不影响另一方。甚至双方根本不知道对方的存在。

好了,说了这么多的大道理,我们来看看针对Browser,具体如何实现吧。

 

1.将BrowserApp的对外服务抽象成一个MIME Type,假设为WapService,并且约定下面的规约:

WapService://DefaultLaunch                 默认方式启动

WapService://MailLaunch                   启动并进入互动信箱

WapService://HomePageLaunch              启动并加载主页

WapService://URLLaunch?URLValue          启动并加载客户指定的URL

2.BrowserApp在MIF中注册该MIME Type,即 WapService

3.BrowserApp在自己的实现中履行该规约,即,在HandleEvent中实现上述请求。

4.Browser Extension继承至一个抽象接口,IBrowserBase,并实现所有的方法。

5.Browser Extension注册自己的MIME Type,假设为WapServiceExtension。

6.Browser模块无须将任何信息暴露给客户。对于上面提到的规约和IBrowserBase.h,那甚至应该是客户提供的!

7.客户需要请求Browser App提供服务时,只需要调用ISHELL_SendURL/PostURL并按照规约传入不同的请求MIME Type String即可。注意,这里客户对“实现”一无所知,这种绑定是在运行期,且委托给了BREW内核。CLSID这个该死的家伙现在已经不需要了!

8.客户需要请求Browser Extension提供服务时,只需要调用ISHELL_GetHandler并按照规约传入WapServiceExtension,即可获得具体Extension的CLSID并进行创建接口。需要注意的是,这里获得的CLSID是在运行时动态获得的(BREW内核返回的),并非在编译期绑定。所以具体对象的实例化是在运行时才确定的,唯一只有抽象接口才是在编译期决定的,但是这又何妨,这本身就是一种规约。

9.客户获得实例化的Extension对象后,就可以按照规约(IBrowserBase抽象接口定义的抽象方法)来使用它了。

 

现在,我们来看看当“需求”变化时的情况:

很不幸,现有的Browser提供商终究还是被“枪毙”了,新的Browser供应商来到了。在最早的时刻,我们就把我们的规约扔给了他们,包括IBrowserBase.h以及其他的MIME Type规约。(他们为我们提供服务,所以得听我们的,规约由我们来定J)

OK,新的供应商很有经验,没几天就按规约完成了一切。此时,我们需要集成它们的模块,我们需要作什么??

我们不需要修改任何客户代码!

我们仅仅需要重新编译,连接生成我们的Image文件(如果以静态方式集成的话)。

我们甚至连Image文件都不需要重新生成(如果直接加载动态应用的话)。

这一切是如何发生的那??

请重新看看上面框图中的那堵墙,那些规约。

 

别高兴的太早,供应商也从我们这里学到了。现在它们需要我们的服务了,它们也扔了一份规约给我们。

该我们行动了:-)

 

 

 

 

从理想S参数到实际版图:用ADS DemoKit PDK实战滤波器设计,我踩了这些坑 本文详细介绍了使用ADS DemoKit PDK设计切比雪夫滤波器的实战经验,从理想S参数到实际版图的转换过程中遇到的典型问题及解决方案。重点分析了PDK元件的实际特性与理想模型的差异,提供了元件替换的渐进式策略和版图布局的实用技巧,帮助工程师在射频芯片设计中避免常见陷阱,提升滤波器性能。 阅读详情

相关推荐

BREW小游戏推箱子源代码

基于brew平台的一个经典小游戏,附带源代码

centos7下安装mongodb

转载:https://www.cnblogs.com/yu-hailong/p/8502840.html 个人以为是最详细的

东方欲晓的晓东的博客 278

CorelDRAW 2019安装指南:从下载到激活的完整步骤

本文提供了一份详细的CorelDRAW 2019安装指南,涵盖从下载安装包、检查系统环境到完成激活的完整步骤。文章重点解析了安装过程中的关键选项设置,并分享了首次启动后的优化配置与常见问题解决方案,旨在帮助用户高效、顺利地完成这款经典矢量设计软件的安装与配置。

weixin_29213827的博客 825

基于BREW的松耦合设计再探

<br /> <br />基于BREW的松耦合设计再探<br />毛晓冬2007-10-23<br />一、        概述:<br />承接上篇《基于BREW的松耦合设计初探》,本文介绍如何利用BREW的INotifier机制解耦应用间的通信。<br />本文借用的例子是IDLE通知的实现。尽管关于利用INotifier机制实现IDLE通知的阐述我先前的相关文档中已经有涉及,但本文更侧重的是,在需求变化的情况下,如何由原有的设计一步步重构到最终的设计,所以注重的是方案的演化过程,而不是最终的方案本身

东方欲晓的专栏 619

企业微信消息推送(一)接收消息服务器URL

企业微信限制过多,公司域名所有权检验不通过。采用接收消息服务器URL的方式。使用vscode,将UTF-8 BOM文本编码改为UTF-8。配置接收消息服务器URL。

Xiaoweidumpb 1万+

ESP8266+ITR8307实战:如何用反射式光电管实现5cm远距离检测(附避坑指南)

本文详细介绍了如何利用ESP8266的ADC功能与ITR8307反射式光电管,通过调制解调、硬件电路优化及软件同步采样策略,实现5cm稳定远距离检测。文章提供了完整的硬件设计、代码实现与调优避坑指南,有效解决了环境光干扰与信号衰减难题,适用于智能车、自动化等需要可靠非接触检测的项目。

rgv234567的博客 262

基于BREW平台松耦合设计V-USBApp的设计和权衡

<br /><br />基于BREW平台松耦合设计V-USBApp的设计和权衡<br />毛晓冬 2008-5-7<br />一、        概论:<br />本文通过一个新模块USB App的设计,探讨了一些基本的设计思想和原则,同时说明了思想和原则的使用有时必须权衡复杂度。<br /> <br />二、        需求说明:<br />目前我们手机进入U盘模式的设计是通过进入Setting菜单选择后进入。但是现在主流手机的实现,都是在任意界面插入USB数据线后,自动弹出选择框,供用户选择进入

东方欲晓的专栏 647

开关电源EMI滤波设计:如何通过Cx和Cy电容精准抑制共模与差模干扰?

本文深入解析了开关电源EMI滤波设计中Cx和Cy电容的核心作用。Cx电容并联于火线与零线之间,专用于抑制差模干扰;Cy电容连接于火线/零线与地之间,则负责泄放共模干扰。文章详细阐述了二者选型、安规要求及PCB布局要点,并提供了基于测试频谱的实战调优策略,是解决电源传导噪声问题的实用指南。

7z8x2c4v6b9的博客 466

基于BREW平台的松耦合设计III-可移植、可复用软件的设计原则

<br /> <br />基于BREW平台的松耦合设计III-可移植、可复用软件的设计原则<br />毛晓冬2007-10-26<br /> <br />一、    概述:<br />本文主要阐述基于BREW平台的可移植/可复用软件的最通用的设计原则,以便利用BREW平台自身的优势,加快开发。<br /> <br />二、    高低层(应用和底层实现)组件间的设计原则:<br /> <br /><br /> <br /> <br /><br /><br /><br />高低层组件间的设计原则,如上图描述的

东方欲晓的专栏 775

Oracle监听配置

Oracle监听配置## 标题 选择“监听程序配置”,然后下一步。 选择重新配置,然后下一步/。 不用管,按下一步。 下一步。 选择“否”,下一步。 选择"本地net服务名配置",然后下一步。 选择“重新配置”,然后下一步。 服务名 是"Oracle",然后下一步。 主机为你的IP地址,在doc系统下通过"ipconfig"获取IP地址。然后输入,然后下一步。 选择“是,进行测试...

m0_46079215的博客 806

《用 AI 赋能医药科研创新》目录(持续更新)

本专栏旨在指导医学科研和药物研发人员运用AI技术提升研究效率。内容包括:利用AI分析文献、识别研究热点、自动生成研究草稿;在新药研发中,通过AI优化临床方案设计、受试者筛选等环节;介绍AI理论基础如大语言模型、提示词工程学及智能体技术发展历程。专栏采用5000-9000字的长文形式,系统讲解AI在医药研发各环节的应用方法,帮助研究者缩短周期、降低成本,推动医药研发进入智能化新阶段。

MD Code 498

基于BREW平台松耦合设计IV-重构AlarmService的整体设计

<br /> <br />基于BREW平台松耦合设计IV-重构AlarmService的整体设计<br />毛晓冬2008-5-6<br /> <br />一、           概述:<br />本文主要通过一个实际模块的改善过程,感性的体现设计原则的使用。<br /> <br />二、           目前的AlarmService框架:<br /> <br />目前的AlarmService主要包括两个模块,AlarmApp,TodoApp。AlarmApp主要负责闹铃(包括自动关机,关机闹

东方欲晓的专栏 681

AI 编程工具面试题(Claude Code、Codex 等)基础篇(一)

文章摘要: 本文整理了20道AI编程工具基础面试题,涵盖Claude Code、Codex CLI、GitHub Copilot等主流工具的核心概念与实操技巧。内容分为工具分类(代码补全/对话式/自主代理)、安装配置(静默部署/API管理)、关键命令(上下文加载/token监控)、调试策略(错误处理/提示优化)及对比选型(Tabnine vs Copilot)。重点解析了终端工具与模型能力的差异,并针对实际场景(如长代码生成/私有化部署)提供解决方案。附追问环节,深入探讨工具边界问题(如上下文溢出处理)和成

篮球界最会写bug的人;程序猿中打球最菜的人。 333

[深入分析BREW机制]:动手写BREW扩展接口

动手写BREW扩展接口 ——目录—— 引言 1、写扩展接口最好要熟悉的几个宏 2、示例接口IStringParse 3、接口解析  3.1 头文件解析  3.2 .c文件解析  3.3接口实例的创建  3.4接口的实现函数  3.5接口的释放 结语引言 扩展接口在BREW开发中很重要,使你的程序更健壮,维护工作更高效。一个程序应尽力将业务处理分离成功能类接口,这使得业务的实现和维护,与对业务的

chinesecoolman的专栏 1918

DeepSeek + 微信:手把手教你把 AI 接入个人微信,秒变“高情商”聊天助手(防封指南)

将 DeepSeek 接入微信,本质上是给你的微信装了一个**“最强外挂”**。它不仅能帮你回消息,还能帮你写周报、查资料、甚至陪聊解闷。工具是服务于人的,不要让 AI 完全替代了你的真情实感。毕竟,真正的高情商,是屏幕背后那个在乎对方的你。先申请一个小号,按照步骤跑通流程。然后试着调整 Prompt,训练一个属于你自己的“嘴替”吧!

BUG猿的博客 957

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

BREW SDK 九大功能之电信服务

BREW SDK电信服务模块深度解析与技术指南 本文全面剖析了高通BREW平台核心的电信服务模块,涵盖电话、短信、网络状态、SIM卡及补充业务五大功能体系。文章以2万字的篇幅系统阐述:1)分层架构设计与接口抽象原理;2)电话服务的状态机模型与呼叫流程实现;3)短信服务的PDU编码与长短信处理机制;4)网络状态监控与基站定位技术;5)SIM卡文件系统访问规范。通过典型代码示例和"TeleMaster"实战案例,详解异步事件驱动、资源管理等核心开发范式,对比BREW与现代移动通信框架的演进关

油墨香^-^的博客 743

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

brew动态模块文件格式发展浅析:From MOD to MOD1

<br /><br />为什么在BMP中开始引入MOD1格式,并且同时支持MOD和MOD1两种格式那? 这还得从最初的MOD格式开始说起。<br />话说,最初时,BREW利用MOD这种格式作为动态模块加载的文件格式。 其实, MOD文件是纯的可执行文件,除了RO DATA, RO Code Section以外,不再包含任何的非可执行的数据,如符号表等。  MOD是从ELF转换而来的,剔除冗余的数据后,就变成了一个纯的可执行文件 MOD。<br />由于是纯的可执行文件,所以,理论上当MOD被加载后,PC跳

东方欲晓的专栏 884

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android, BREW中Observer(观察者)模式的两种表现

Observer模式无疑是最伟大的设计模式之一。 她被用来解耦一对多的关系,并对“多”的变化进行隔离。 现代移动平台中,各是随处可见她的身影。 本文将从Android,BREW两个移动平台中,一窥其迷人身姿。Listener机制。 在BREW和Android中,同时都提供了Listener机制。这是血统纯正的Observer模式体现。 BREW中的IModel的AddListener和Android中的View的AddXXXListener就是两个很好的例子。 在这种纯种Observer模式下,我们需要明确

东方欲晓的专栏 901

BREW事件使用技巧: 避免事件冲突

详述了BREW中事件定义的注意点

东方欲晓的专栏 901

BREW SDK 九大功能之安全服务

摘要: BREW SDK安全服务是高通为移动应用提供的一套模块化安全解决方案,涵盖对称/非对称加密、哈希函数、消息认证码、数字签名、证书管理、随机数生成、安全存储及SSL/TLS协议九大核心功能。其分层架构(硬件抽象层、密码学服务层、应用层)确保安全边界清晰,支持AES、RSA、ECC等算法,并通过安全上下文、密钥管理器等组件实现松耦合交互。文章详细解析了各功能原理(如AES工作模式、ECDH密钥交换)、API使用示例及最佳实践(如密钥管理、IV随机化),强调功能协同(如TLS中证书验证与加密组合),并指出

油墨香^-^的博客 364

基于BREW的手机全局搜索方案

<br /> <br />一、   概述:<br />随着3G时代的到来,用户可以通过手机获得海量信息。如何在此海量信息中快速搜索用户想要的内容,成为一个重要的功能。全局搜索因此而生。<br /><br /><br />二、   整体框架<br />整体框架必须低耦合,可扩展。以便任何一部分的变化都能独立运作,能适应将来的变化。<br />整体框架图如下(见下页)。<br />工作流程为:<br />1.          全局搜索模块启动时,解析SearchComponentConfig.ini文件

东方欲晓的专栏 627

有限状态机(finity state machine)

       有限状态机简称FSM,FSM就是描述一个过程由有限个独立状态组成,这些状态可以互相迁移,直到最终离开这个过程.游戏就是一个FSM,因为游戏总是由一些状态组成,每个场景就是一个状态,然后游戏的整个过程就是不断在这些场景中切换,来推动游戏的进行.可以说游戏框架不只是FSM,但是FSM绝对是游戏框架的核心.        前一段时间通过移植一款韩国游戏,我从中抽出了一个FSM框架,是B

fastzhao的专栏 2129

ActiveMQ 的使用

ActiveMQ 的使用一:介绍 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

stanlee的博客 7652

python程序设计模板_python设计模式-模板方法模式

date: 2018-12-02T17:23:56+08:00description: python 设计模式 模板方法模式draft: falseslug: "python-design-pattern-template-pattern"categories: ["development", "python", "设计模式"]tags: ["python", "读书笔记", "设计模式"]ti...

weixin_39728221的博客 127

解密CraftBeerPi系统架构:Flask+Socket.IO+AngularJS实时酿造控制设计全解析

🍺 **CraftBeerPi** 是一个基于 **Flask + Socket.IO + AngularJS** 的**自酿啤酒实时酿造控制系统**:树莓派负责读取温度传感器、驱动加热与泵阀,Flask 提供 Web 与 REST API,Socket.IO 以 WebSocket 把温度、糖度、步骤状态秒级推送到浏览器,AngularJS 单页应用负责仪表盘与操作界面。本文带你完整解析这套"

gitblog_00390的博客 431
上一篇: BREW MIME机制与Android Activity Intent机制的比较
下一篇: 基于BREW的松耦合设计再探
nicefuture
博客等级 码龄23年 75粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值