ANDROID 中设计模式的采用--行为模式



1 职责链模式

职责链模式的意图为:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。职责链模式的结构图如下:

在ANDROID的输入管理系统中提交输入事件到视图时使用了职责链模式,其类图所示:

类图中的ViewRootImpl类的内部类EarlyPostImeInputStage、NativePostImeInputStage、ViewPostImeInputStage、SyntheticInputStage构成一个输入事件责任处理链,用来分阶段处理输入事件,如果本阶段对事件没有处理,则传递到下一个对象进行处理,直至事件被处理。

2、命令模式

命令模式的意图为:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。命令模式的结构图如下:

在ANDROID系统中命令模式用的也比较多,如在事件输入系统中,在InputDispatcher对象转发事件过程中就采用了命令模式:把每一个输入事件封装为类型为NotifyArgs的对象,不同的事件对应NotifyArgs类的不同子类,如按键事件对应NotifyKeyArgs类,触摸事件对应NotifyMotionArgs类,而NotifyArgs命令的接收对象为InputDispatcher,因此通过事件命令的执行把事件本身转发给InputDispatcher对象,实现事件的提交。相关模式类图如下:

3  解释器模式

解释器模式的意图为:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式的结构图如下:

在android系统中,包管理服务对应用包的解析使用了解释器模式。

包管理服务采用PackageParser类来负责应用包的解析,PackageParser类使用了解释器模式对一个应用包进行解释,对于应用包中的每种语法结构都创建了对应的类,来分别搜集应用包中的相应信息。类结构图如下:

图中除了Resources及XmlPullParser两个类外其余的类都是PackageParser类的内部类,应用包中的每个语法结构对应的类都派生自componet类且属于componet类的内部成员,Package类(一个包一个Package对象)是一个聚合类,用来把解析出来的一个应用包中的componet信息聚合到Package类中进行统一管理,PackageParser类将解析出的每个componet信息添加到Package中。

4 、迭代器模式

迭代器模式的意图为:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。迭代器模式的结构图如下:

迭代器模式是个普遍使用的模式,JAVA的集合类库(列表,集合,映射、字典,有序集,字符串等)都以不同的形式提供了迭代器,用来对集合类中的元素进行遍历。

5、中介者模式

中介者模式的意图为:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的结构图如下:

在 ANDROID系统中keyguard的功能实现采用了中介者模式,用来中介keyguard相关的请求,包括查询keyguard的状态,影响keyguard应当显示和复位的电源管理事件,以及当keyguard显示时对窗口管理的通知事件和来自keyguard视图本身的关于keyguard是否成功unlocked的事件等。相关UML类图如下:

其中KeyguardViewMediator作为中介者角色,与电源管理、用户管理、报警管理、声音管理、状态条管理、KeyguardViewManager、KeyguardDisplayManager、KeyguardUpdateMonitor等服务或对象交互,
读取相关状态,执行和触发keyguard事件相关的功能等 ,而KeyguardViewManager、KeyguardHostView、KeyguardUpdateMonitor类通过相关回调向KeyguardViewMediator传送Keyguard视图本身和keyguard有关状态更新方面的事件,
另外KeyguardService服务也是通过KeyguardViewMediator查询keyguard的状态
并通过IKeyguardService接口对外提供keyguard的状态信息。

6 备忘录模式

备忘录模式的意图为:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。备忘录模式的结构图如下:

      在ANDROID系统中有不少采用备忘录模式的例子,如ACTIVITY活动状态的保存和恢复就是采用备忘录模式的一个例子。

在一个活动暂停或停止时调用活动的onSaveInstanceState(Bundle outState)函数把ACTIVITY的当前状态保存到Bundle对象中,活动恢复或重新启动时调用活动的onRestoreInstanceState(Bundle
savedInstanceState)函数恢复到原先状态。

7、观察者模式

观察者模式的意图为:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式的结构图如下:

观察者模式也称发布-订阅者模式,可以实现目标和多个观察者间的松散耦合,并支持广播通信,是最常用的设计模式之一。

在ANDROID系统中观察者模式也是普遍采用,观察者模式提供了ANDROD架构连接件的基础,在系统提供的广播组件及内容提供者组件、通知服务中以及视图控件和底层事件监听、UI事件输入等许多方面普遍采用。

观察者模式也是MVC模式的实现基础,M VC中的M
o d e l类担任目标的角色,而Vi e w担任观察者的角色。

8、状态模式

状态模式的意图为:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。状态模式的结构图如下:

状态模式在ANDROID系统中用的也比较多,尤其在数据连接、WIFI、蓝牙等网络连接和状态管理方面。

如在WIFI管理方面,就提供了WifiStateMachine、P2pStateMachine、WifiController、WifiApConfigStore、WifiWatchdogStateMachine五个状态机来管理WIFI相关功能的不同状态。每个状态机对象在状态模式中起到Context作用,用来汇聚相关状态,启动状态执行等。

ANDROID系统中每个状态机管理的状态都派生自State类,State类是IState接口的实现。

WifiApConfigStore管理的状态图如下:

9、策略模式

策略模式的意图为:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。策略模式的结构图如下:

策略模式也是经常使用的模式,在ANDROID系统的几乎每个子系统中都有策略模式使用的影子,如窗口管理服务中提供窗口管理相关策略的WindowManagerPolicy接口对象;输入管理系统中提供输入事件读取和提交策略的InputReaderPolicyInterface和PointerControllerPolicyInterface接口对象,以及输入事件映射算法等;声音相关服务中提供声音输入和输出配置和激活策略的AudioPolicyInterface接口对象;网络管理相关服务中提供网络统计匹配策略的NetworkPolicy对象等。

10、模板方法模式

模板方法模式的意图为:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M et h o d使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式的结构图如下:

模板方法模式和观察者模式一样也是最常用的设计模式之一,模板方法非常基本,几乎可以在任何一个抽象类中找到。工厂方法也是采用模板模式创建对象的特例。

在ANDROID系统中模板方法模式更是作为整个系统框架的基础和核心,为应用程序组件运行(包括ACTIVITY、SERVICE、Broadcastreceiver)提供了大的运行骨架,应用程序只需在应用组件的派生类中重新实现钩子函数(模板方法),即可以实现应用程序的客制化功能,这样既可以实现多样化的应用,又能够使应用程序开发遵循同样的框架API。

11、访问者模式

访问者模式的意图为:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式的结构图如下:

访问者模式在ANDROID系统中也有使用,如输入管理服务中在调用getKeyboardLayout(String keyboardLayoutDescriptor)函数来获得键盘布局时,就使用了访问者模式。getKeyboardLayout函数调用visitKeyboardLayout(StringkeyboardLayoutDescriptor,KeyboardLayoutVisitor
visitor)函数通过包管理服务来查询每个包,在应用包中发现keyboard-layout元素时, 就调用访问者的visitKeyboardLayout函数来根据发现的keyboard-layout元素创建一个KeyboardLayout键盘布局对象。

版权所有,请转载时清楚注明链接和出处,谢谢!











ANDROID 中设计模式的采用--行为模式

时间: 2024-09-29 05:49:44

ANDROID 中设计模式的采用--行为模式的相关文章

Android架构篇--MVP模式的介绍篇

摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经在商业项目中从零开始大规模采用过MVP模式对项目进行开发.在使用MVP模式进行开发的时候发现项目的结构模式对开发是有一定的影响的,在这里笔者会对这一问题进行探讨.希望通过这篇blog能让读者了解如何使用MVP模式搭建一个功能完善的MVP模式开发框架,避免一些笔者认为比较严重的问题. 为什么要使用MVP模式 在传统的Android开发中,我们一般是使用MVC模式进行开发的.传统MVC模式介绍: View: 视图层,对应x

ANDROID 中设计模式的采用--结构型模式

结构型模式中的适配器模式.外观模式.装饰模式.代理模式都属于包装模式,都是对另外的类或对象的包装,只是各自的意图不同. 适配器模式通过对另外的类或对象的包装,将其接口转换为用户期望的接口,达到接口适配的目的. 外观模式是对包装的一组类或对象提供一个高层接口,意图是简化接口,使系统更加容易使用. 装饰模式的意图是在不改变包装对象接口的情况下为其增加另外的功能或职责. 代理模式的意图是通过对包装对象的包装以便控制对包装对象的访问. 适配器模式.外观模式对客户提供的接口与其包装类的接口有所不同,也就是

ANDROID 中设计模式的采用--创建型模式

 所谓模式就是在某一情景下解决某个问题的固定解决方案. 所有的创建型模式都是用作对象的创建或实例化的解决方案.         1 简单工厂模式 创建对象的最简单方法是使用new来创建一个对象,如果只创建一种固定不变的对象,可以使用new来创建这个对象. 如果要根据不同场景创建不同类型的对象,就可能需要采用不同的方法,就出现了不同的模式的采用和总结. 如ANDROID的媒体框架中为了实现对不同媒体源的播放,就需要实现多种播放器对象,并可能需要根据支持的媒体类型的增加,不断添加播放器对象. s

ANDROID 中设计模式的採用--结构型模式

        结构型模式中的适配器模式.外观模式.装饰模式.代理模式都属于包装模式,都是对另外的类或对象的包装,仅仅是各自的意图不同. 适配器模式通过对另外的类或对象的包装,将其接口转换为用户期望的接口,达到接口适配的目的. 外观模式是对包装的一组类或对象提供一个高层接口,意图是简化接口,使系统更加easy使用. 装饰模式的意图是在不改变包装对象接口的情况下为其添加另外的功能或职责. 代理模式的意图是通过对包装对象的包装以便控制对包装对象的訪问. 适配器模式.外观模式对客户提供的接口与其包

Android中设计模式--策略模式(封装会变化的算法部分,面向接口不针对实现)

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 理解: 把代码中类似,但又有差异的算法部分,提取出来,定义一个借口,不同的算法来进行不同的实现,但调用算法的客户可以进行统一的调用,因为实现了共同的借口,客户不需要知道具体的实现,而是知道怎么用,即针对接口编程,而不针对实现编程. 总结: 找出代码中可能需要变换之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 例子 private TextClickInterface mClickI

Android Activity的4种启动模式详解(示例)

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用的入口Activity(即<intent-filter.../>中配置为 MAIN和LAUNCHER的Activity). 因为Android并没有为Task提供API,因此我们无法真正去访问Task,只

Android开发之Activity的启动模式

黑发不知勤学早,白首方悔读书迟.--<劝学> 今天花了整个下午+晚上的的时间学习了Activity的启动模式,本来以为这个知识点很简单,但是在学习的过程中发现,Activity的启动模式并没有自己想象的那么简单,下面我们一起来看看这Activity的四种启动模式吧,如有疑问欢迎留言,如有谬误欢迎大家批评指正,谢谢 Activity的启动模式共有四种 1.standard 2.singleTop 3.singleTask 4.singleInstance 如图所示: LaunchMode在多个A

《深入透析Android》之 浅析Activity启动模式

前言: Activity的启动模式是一个既基础又容易忽视的问题,但是这个问题有个深刻的认识,对程序员写一个稳定高效的Android程序帮助很大,今天,在B哥引导下,我们对Activity启动模式.Intent Flags做了一番很好的探究. 探究历程: ①   什么是栈 ②   Activity栈 ③   Task ④  Activity启动模式 ⑤  Activity栈和Task联系 ⑥  Intent Flags  ⑦  Activity相关属性taskAffinity 1.    什么是栈

Android源码分析之原型模式

模式的定义 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 使用场景 1.类初始化需要消化非常多的资源,这个资源包括数据.硬件资源等,通过原型拷贝避免这些消耗: 2.通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式: 3.一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝. UML类图 角色介绍 Client  :  客户端用户. Prototype : 抽象类或者接口,声明