背景
模块化带来的好处不言而喻。模块间通过接口互相调用服务,从而实现系统的高内聚与低耦合。
然而接口本身也需要临时内存。在接口间传递数据需要大量的内存。
让我们回忆一下面向对象编程中对于耦合的七种定义。其中推荐的做法之一就是使用所谓“数据耦合”的机制,即在接口间仅传递简单的数据结构、仅传递需要使用的数据。
Android官方编程指南则说的更直白:推荐使用内部类。在极端情况下,没有接口间的互相调用,由此节省下来的内存数量则相当可观了。
模式
因此,我们需要设计出一种让客户可以自由控制数据传输的接口。
那么这里的客户该如何定义呢?根据卡耐基梅隆大学的面向对象教材,调用的一方称为客户(client),而被调用的一方称为对象(object)。为了避免歧义,我们将后者称为服务方。
更深入的探讨
正如前文提到的那样,尽量减少接口间数据传递量是一种很好的方法。现成的例子有很多,比如我们在对mysql进行查询时,通常返回的是一个游标。
然而最小化数据传递的好处,不仅“省内存”,还“省钱”。在一些按照流量计费的场景中,当我们使用移动设备访问web service等,如果对返回的数据进行优化,所需流量就少了,客户需要付出的钞票自然也少了。设想一则天气查询的例子,实在没有必要将某地的经纬度、简介等信息也一并给传给用户。
实现
1、最简单的实现方法如前文所述,传递指针(游标可以看做是一个指针),而不是传递值。
2、当然,步进式接口也是经常采用的策略。如同上文提到的对数据库的访问操作,以及相仿的只要是经由接口传递数据序列或数据群集,都应当将接口设计为步进式,即经过多次调用,获得全部信息,每次调用仅传递一小部分信息而已。当然,也可以通过iterator这样的媒介物而省去多次调用的麻烦。
3、让我们来看一看组件间交换内存的策略。
常用的策略有三种,分别是:借出、借入、转移。
- 先来看借出(photoshop这玩意还真不适合画流程图...本文的图示都是使用dia画的)。
在借出策略中,客户负责借出一块内存空间给服务方。比如:
// new一个Var对象
Var var = new Var();
Entity.getVar(var);
当var不再需要时,客户必须负责释放它。
var = null;
这种策略特别适合以下场景:1、客户需要拥有对数据完全的控制;2、数据多为简单类型;3、服务方和客户分处不同的内存空间(如Symbian的client-server interface)。
在我之前的文章
使用C#和DirectX实时监控麦克风输入音量中,就是在音量计算类中预先分配一个数组,然后再通过DirectX将音频捕捉缓存读入该数组,接着对该数组进行各种运算。
在借入策略中,客户并不分配一块内存空间来缓存数据,它直接借入服务方拥有的对象。然而这种使用是有条件的,即对数据的操作受到限制:
1、试想如果Entity类没有提供setVar方法,那么Action类将无法修改var。
2、并且,当有多个对象同时需要借入服务方拥有的对象时,共享数据问题就出现了。这时需要为共享数据设置同步(如PV操作)。
这种策略特别适合以下场景:1、客户不需要保留数据;2、数据是复杂类型,且客户往往只会用到复杂类型中的一小部分。
在开发中,我们为每一个实体类的类变量创建get和set方法以供调用,这就是一种典型的借入策略的应用。
在转移策略中,每次Action调用getVar时,Entity都为其初始化一个对象,然后返回此新对象的引用给客户。到目前为止,转移策略的描述更接近借入策略。然而,在转移策略中,客户还要负责对象的销毁。
细心的你看出什么问题没有?转移策略显然增大了不同模块间的耦合,并且对于粗心的程序员来说,他们很可能忘记释放这个不属于他们自己编写的模块的对象,这很容易导致在使用了
内存限额设计模式的服务方因为达到内存上限而被终止。
这种策略适用于以下场景:1、客户需要保留数据;3、数据多是复杂类型,且客户往往只会用到其中一部分。
举一个现实生活中的例子。现在某图书馆内有5本《算法导论》(内存限额,5本都借出则不能再借了),每一个读者前去借书时,管理员都会拿出一本《算法导论》给你。管理员并不负责这本书的归还,虽然这本书的确是图书馆的(当然,国外的管理员很有可能会不停地打电话来催你,不过国内的懒惰又傲慢的图书管理员通常不会干这些事情)。当你看完这本书之后(能耐着性子看完《算法导论》的人也算挺厉害的了,反正我没这个耐心),你自己回到图书馆,归还此书。
示例
比较简单,加上我比较懒,就不写了。
预告
下一篇,介绍局部毁弃。
- 大小: 9 KB
- 大小: 6.2 KB
- 大小: 6.5 KB
分享到:
相关推荐
### 内存受限系统软件开发中的UI设计模式与思考小型化方法 #### 一、引言 在现代软件开发过程中,特别是在嵌入式系统或移动设备等资源受限环境中,如何有效地利用有限的内存资源成为了一个重要的挑战。《内存受限...
在Java中,设计模式如工厂模式、单例模式、观察者模式等,是常见的设计模型,它们提供了解决特定问题的标准结构和最佳实践。 文章部分内容提到了“客户端编程”和“Web服务器”的背景,这与设计模型有关,因为它们...
相比之下,UDIMM在支持多通道时受限于每个通道只能安装2个插槽。 - **成本考量**:UDIMM通常成本较低,适合预算有限的应用场景。而RDIMM虽然性能更优,但相应的价格也更高。 #### 四、应用场景 ##### 1. RDIMM - **...
在当前的技术背景下,嵌入式系统的图形界面开发越来越受到重视,尤其在车载导航系统等特定应用领域中,提供良好的用户交互界面是吸引用户和提高用户满意度的关键。本毕业设计选择了基于QT框架的GPS车载导航系统作为...
微服务架构是现代软件开发领域中的一种流行设计模式,它与传统的单体架构形成了鲜明对比。微服务架构强调将一个大型的复杂应用分解为一系列小型、独立的服务,每个服务都能单独部署并专注于完成特定的业务功能。这种...
- **复杂性增加**:服务间的通信和协调需要额外管理,接口设计和监控成为关键。 4. **容器化与云原生架构** 随着Docker和Kubernetes等技术的发展,容器化和云原生架构成为趋势。服务被封装在轻量级容器中,可以...
6. **插件扩展**:pj的轻量级设计并不意味着功能受限,开发者可以基于pj开发自己的插件,以满足特定需求。 在实际应用中,pj库适合于小型项目或者作为大型项目中某个特定模块的解决方案。例如,如果你有一个简单的...
4. **低功耗模式**:为了延长电池寿命,KL02具备多种低功耗模式,包括睡眠、停机和待机,能够在不影响响应速度的前提下,显著降低设备的能耗。 5. **丰富的外设集**:尽管体积小巧,但KL02仍然提供了丰富的外设选项...
1. **轻量级**:LwIP设计的目标是占用较少的内存和CPU资源,适合于资源受限的嵌入式设备。 2. **模块化**:LwIP由多个独立模块组成,如TCP/IP协议处理、UDP、DNS等,可以根据需求选择启用或禁用。 3. **多线程与单...
- **内存资源**:受限于硬件规格,需优化内存使用效率。 #### 知识点三:时间共享系统与个人电脑的选择 在何种情况下,用户更适合使用时间共享系统而不是个人电脑或单用户工作站? - **当系统硬件性能强劲且用户...
I2C总线的数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下甚至可以达到3.4Mbit/s。总线上数据的传输是按字节进行的,且低位在前。由于其开漏或开集电极输出的特性,需要加上拉电阻,...
《管理信息系统》课程设计报告——书店管理信息系统 本报告详细阐述了一个针对中、小型书店的管理信息系统的设计过程,旨在提高书店的管理效率和服务质量。系统开发涵盖了需求分析、必要性研究、可行性研究、系统...
2. 小型化:由于嵌入式设备硬件资源有限,EOS往往设计得轻量化,只包含必要的组件,如内核、文件系统、设备驱动等。 3. 可定制性:根据应用需求,嵌入式操作系统可以进行深度定制,比如裁剪内核、选择合适的文件系统...
在探讨《JOGL学习PDF2》中所提及的“JOGL2:Touring the World”这一主题时,我们深入剖析了Java编程环境下的OpenGL(JOGL)应用,通过构建一个小型的3D世界,展示了一系列高级渲染技术和游戏开发技巧。本章重点介绍...
2. **方案设计**:细化网络拓扑结构、设备选型、服务配置等内容。 3. **系统部署**:按设计方案安装硬件设备、配置操作系统和网络服务。 4. **测试验证**:进行全面的功能和性能测试,确保系统稳定可靠。 5. **培训...
【低成本高品牌——中小型企业低成本品牌营销策略】 品牌对于任何企业,无论大小,都是至关重要的。品牌不仅是知名度的象征,更是消费者对产品质量、服务、文化价值等多方面体验的综合体现。中小型企业往往受限于...
《单片机原理》课程“口袋实验”教学方式的探索及实践是顺应了当今科学技术快速发展和教学实验设备小型化、便携化趋势的一种创新教学模式。这种教学方式的核心在于将实验设备微型化,使得学生可以在任意地点、任何...