Android设计模式系列(1)--SDK源码之组合模式
2016-03-14 16:32
633 查看
Android设计模式系列(1)–SDK源码之组合模式
Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用。在android UI设计,几乎所有的widget和布局类都依靠这两个类。
组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。
1.意图
将对象View和ViewGroup组合成树形结构以表示”部分-整体”的层次结构(View可以做为ViewGroup的一部分)。
组合模式使得用户对单个对象View和组合对象ViewGroup的使用具有一致性。
2.结构
针对View和ViewGroup的实际情况,我们选择安全式的组合模式(在组合对象中添加add,remove,getChild方法),添加少许的注释,我们把上图修改为:
3.代码
View类的实现:
ViewGroup的实现:
4.效果
(1).结构型模式
(2).定义了包含基本对象和组合对象的类层次结构。这种结构能够灵活控制基本对象与组合对象的使用。
(3).简化客户代码。基本对象和组合对象有一致性,用户不用区分它们。
(4).使得更容易添加新类型的组件。
(5).使你的设计变得更加一般化。
5.分类
组合模式分为透明方式与安全方式
透明方式:Component中声明所有用来管理子对象的方法,其中包括Add,Remove等,这样实现Component接口的所有子类都具备了Add和Remove,这样做的好处就是叶节点和枝节点对于外界没有区别,它们具备完全一致的行为接口,但问题也很明显,因为Leaf类本身不具备Add,Remove方法的功能,所以实现它是没有意义的。
安全方式:Component接口中不声明Add和Remove方法,那么子类的Leaf就不用去实现它,而是在Composite声明用来管理子类的方法,这样就不会出现刚才提到的问题,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,带来了不便。
6.使用
何时使用组合模式?
当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑使用组合模式。
Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用。在android UI设计,几乎所有的widget和布局类都依靠这两个类。
组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。
1.意图
将对象View和ViewGroup组合成树形结构以表示”部分-整体”的层次结构(View可以做为ViewGroup的一部分)。
组合模式使得用户对单个对象View和组合对象ViewGroup的使用具有一致性。
2.结构
针对View和ViewGroup的实际情况,我们选择安全式的组合模式(在组合对象中添加add,remove,getChild方法),添加少许的注释,我们把上图修改为:
3.代码
View类的实现:
public class View{ //... ... //省略了无关的方法 }
ViewGroup的实现:
public abstract class ViewGroup extends View{ /** * Adds a child view. */ public void addView(View child) { //... } public void removeView(View view) { //... } /** * Returns the view at the specified position in the group. */ public View getChildAt(int index) { try { return mChildren[index]; } catch (IndexOutOfBoundsException ex) { return null; } } //other methods }
4.效果
(1).结构型模式
(2).定义了包含基本对象和组合对象的类层次结构。这种结构能够灵活控制基本对象与组合对象的使用。
(3).简化客户代码。基本对象和组合对象有一致性,用户不用区分它们。
(4).使得更容易添加新类型的组件。
(5).使你的设计变得更加一般化。
5.分类
组合模式分为透明方式与安全方式
透明方式:Component中声明所有用来管理子对象的方法,其中包括Add,Remove等,这样实现Component接口的所有子类都具备了Add和Remove,这样做的好处就是叶节点和枝节点对于外界没有区别,它们具备完全一致的行为接口,但问题也很明显,因为Leaf类本身不具备Add,Remove方法的功能,所以实现它是没有意义的。
安全方式:Component接口中不声明Add和Remove方法,那么子类的Leaf就不用去实现它,而是在Composite声明用来管理子类的方法,这样就不会出现刚才提到的问题,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,带来了不便。
6.使用
何时使用组合模式?
当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑使用组合模式。
相关文章推荐
- 【Android】上下文菜单ContextMenu的使用
- [置顶] 【Android】android开发之splash闪屏页的四种实现方式,启动页的实现教程。
- Android.mk学习笔记
- android 杀不死服务 解析
- Android初试--常用的隐式意图
- Android SettingProvider详解
- Android入门3:从Toolbar到Material Design
- android多线程断点下载
- 初识Android之Activity和Intent
- android studio 模拟器的选择
- Android ScrollView、ListView冲突问题
- Android实现中文按拼音排序方法
- Android menu.add()的使用说明
- 搭建一个 Android, iOS 的QT环境
- Android开发之异步消息处理机制
- Android进程与线程基本知识
- [转]AndroidStudio导出jar包
- Android实现伸缩弹力分布菜单效果
- Kotlin For Android初体验——配置Kotlin
- Android实现推送方式解决方案