首页 > 编程语言 >Android设计模式系列(1)--SDK源码之组合模式

Android设计模式系列(1)--SDK源码之组合模式

时间:2022-11-22 11:38:58浏览次数:47  
标签:ViewGroup 组合 -- 模式 对象 源码 设计模式 public View


Android设计模式系列(1)–SDK源码之组合模式

Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用。在android UI设计,几乎所有的widget和布局类都依靠这两个类。
组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。

1.意图
将对象View和ViewGroup组合成树形结构以表示”部分-整体”的层次结构(View可以做为ViewGroup的一部分)。
组合模式使得用户对单个对象View和组合对象ViewGroup的使用具有一致性。

2.结构

Android设计模式系列(1)--SDK源码之组合模式_子类

针对View和ViewGroup的实际情况,我们选择安全式的组合模式(在组合对象中添加add,remove,getChild方法),添加少许的注释,我们把上图修改为:

Android设计模式系列(1)--SDK源码之组合模式_层次结构_02

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.使用
何时使用组合模式?
当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑使用组合模式。


标签:ViewGroup,组合,--,模式,对象,源码,设计模式,public,View
From: https://blog.51cto.com/u_10847930/5877238

相关文章

  • 蓝牙实战(二)
    一.概述这是蓝牙实战的第二篇,今天讲讲基本的操作,打开蓝牙可见性,查找设备,显示已绑定设备,先看效果图由于模拟器不支持蓝牙,所以没办法进行相应操作,大家下来可以到真机上测试一......
  • 蓝牙实战(一)
    一.概述在前面的三篇文章讲解蓝牙开发,写的比较详细,篇幅比较长,后面这几篇来点简单实用的,先看效果图二.代码代码如下:BlueToothController控制蓝牙操作publicclassBlueToot......
  • nginx常见问题
    前言本文记载一些nginx常见问题1.connect()fail转发的服务挂了,确保主服务正常运行。可以使用lsof-i:端口号确定被转接的服务的状态2.nginx50X的错误日志去哪看,配置......
  • Android中对Log日志文件的分析(解决ANR)
    一.概述ANR使我们日常开发中偶尔会遇到的一种情况,也就是应用程序无响应,其实在应用出现ANR的时候,系统会在控制台给出错误提示,并且会产生一个相关的日志文件,今天我们就来分析......
  • Android webview实战
    今天来使用webview进行一个实例演练,可以基本用到任何地方,目的在于熟悉一下webview的使用,基本算是入门的吧。先看一下效果图,接下来我们看看如何实现第一步:首先加载网页......
  • Golang常用的工具函数,无依赖,常更
    util.go//Executef()ntimesonfailfuncRetryHandler(nint,ffunc()(bool,error))error{ok,er:=f()ifok&&er==nil{returnnil}ifn-1>0......
  • 从源码的角度探究Activity的启动过程
    一.概述今天我们来搞一下底层一点的东西,大家可能对Activity的生命周期比较熟悉,但是一个Activity是如何启动起来的,你知道吗?今天就来探究一下。二.分析我们先随便写一个demo,然......
  • 从setContentView分析Android加载布局的流程
    一.概述在Activity中,我们基本都会用到setContentView方法,这个方法是干啥的想必大家都知道,把我们写好的布局文件显示到界面上。今天我们就去看看底层的源码,分析一下到底是如......
  • Handler相关面试题
    1.Handler的作用a:在非UI线程更新UIb:发送延迟消息2.为什么Android设计只能ui线程更新ui?a:解决多线程并发问题b:提高界面更新的性能问题c:架构设计的简单3.Handl......
  • Apache poi
    前言开发中经常会涉及到excel的处理,如导出Excel到数据库中,读取Excel内容!操作Excel目前比较流行的就是ApachePOI和阿里巴巴的easyExcel 将用户信息导出为excel表格讲E......