一 Adapter模式

意图:

  将一个类的接口转换成客户希望的另外一个接口。

Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。

适用性:

  1. 使用一个已存在的类,而它的接口不符合你的要求;
  2. 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口,而是使用对象适配器适配他们的父类接口;
  3. 你想创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类(接口可能不一定兼容的类)协同工作;

看看其结构图:

  

    

这是一个对象适配器结构图;

  其实类似这样的类结构图(一个类包含了另一个类的实例并使用其中的方法等)是很多的:

是不是只要具备这样的结构都可以称之为Adapter模式呢?

  Adapter有两种形式:对象适配器和类适配器。

  

    

这是一个类适配器结构图;

理解:

  从继承的角度来理解:Adapter既然能够继承了Adaptee,那么可以认为Adapter就是一个Adaptee,

只有具备这样的关系才可以继承。但是对于Java中的接口可能不同,接口仅仅只是一些列方法声明的集合。

但是如果一个类实现了某个接口XXX,我们说这个类是一个XXX,这样似乎也是不合理的;接口实现是继承也不是,

对Java的接口这个地方搞的不是很明白感觉有些不严密。

  所以并不是具备了这样的类结构都可以称之为Adapter模式;Target和Adaptee之间的关系就是:

有一个新的Target想要使用Adaptee提供的接口,但是不能直接使用需要对其进行改造,于是进行扩展——Adapter模式。

  如果Target是一个抽象类,Adaptee也是一个抽象类,那么结果将是什么样子呢。

Adapter的目的就是为连接Target和Adaptee而生。

使之扩展的余地变得更灵活更广阔,那这还是Adapter模式吗?暂且不管往下走。

  下面通过学习Android中的AdapterView和Adapter对于 Adapter模式和Bridge模式的应用,

来理解Adapter模式和Bridge模式的应用上的经典设计实例。

二 Android中AdapterView显示分析

看一下两个类:

  AdapterView定义public abstract class AdapterView<T extends Adapter> extends ViewGroup,

      <>是Java的泛型,表示T的类型必须是Adapter或其派生类:抽象的ViewGroup类;

  Adapterpublic interface Adapter:一个接口,是AdapterView和Data的桥梁。

看看一个ListView显示需要的条件:

  l  对象控制,属性设置,事件派发处理

    对于对象控制事件处理等属于ViewGroup系统提供稳定的维护和控制方式,也会提供于我们接口去控制某些东西;

  l  显示布局控件ViewItem,属性等

    对于显示上所用的控件布局,系统可能提供缺省的,但是这里我们使用自己的方式的去提供的可能性非常的大;

  l  显示数据Data

    对于数据明显只能是我们动态的提供。

  从代码中可以看到AdapterView及其派生类是系统提供用于显示控制,属性设置,事件派发处理等,是显示的控制中心;

  Adapter派生类是提供显示ViewItem和Data。具体了解可以看看源代码。

  这两个一个是抽象类一个是接口,所以需要做的就是连接这两个类实现SubAdapterView的显示——Adapter模式。

下面学习一下ListView的大概结构及Adapter模式的应用。

三 Android中ListView的Adapter模式应用

看一下ListView与ListAdapter的结构图:

    

    

  AbListView与LIstAdapter就是一个Adapter模式的应用。

  AbListView:抽象类;

  ListAdapter:接口;

这还是Adapter模式吗:

  哈哈,到这里我突然间茫然了,这还是一个Adapter模式吗!怎么看都更像是一个Bridge模式了。

看来理解还是不深刻啊,一是受名称所严重欺骗,二是感觉结构实在和Adapter也很像(将两个类通过对象适配一起工作满足新的应用)。

搞了大半天我实在不想推翻自己无奈……设计模式学习过程中理解太肤浅了。

  Adapter模式里面的适用性所提到:你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。

但是可以适配它的父类接口。从这样理解似乎也没有错啊:我们现在匹配的就是ListAdapter子类。

  既然可以匹配父类适配子类,那么为什么又不可以匹配AblistView以适应子类呢?那这样的结果就是两边都是抽象类或者接口;

那这到底是哪一个模式呢。

下面看一下Bridge模式的描述。

四 AbListView及ListAdapter和Bridge模式

  先看看Bridge模式:

意图:

  将抽象部分与它的实现部分分离,使它们都可以独立的变化。

  抽象部分AbListView:派生类有ListView,GridView等;

  实现部分ListAdapter:派生类有SimpleAdapter,CursorAdapter等;

  满足了定义中将抽象部分与实现部分分离的原则;

适用性:

你不希望在抽象类和它的实现部分之间有一个固定的绑定关系;

类的抽象以及它的实现都应该通过生成子类的方法加以扩充;

抽象类的实现部分修改应该对客户不产生影响;

多个对象之间实现共享;

结构图:

     

AbListViewListAdapter图比较一下:

  

    

两个图结构是不是基本上就是一样的呢?

AdapterBridge比较:

看看书中对于这两个模式的比较:

  Adapter模式用来帮助无关的类协同工作,它通常是在系统设计完成之后才会被使用;

  Bridge模式则是在系统设计开始的时候就被使用,它使得抽象接口和实现部分可以独立的进行改变。

实际分析:

    那么此中的设计会是在设计完成之后发现不对劲,使用Adapter模式来帮助这些类协同工作的吗,

  很明显是在设计之前就已经确定了框架是要如此设计。而且AbListView和ListAdapter是不相关的类吗?

  明显非常相关的两个类,关系紧密结合亲密无间。

Bridge模式要抽象和实现分离:

    是因为其中存在两个两个变化的因素;抽象会有多个派生类,实现也会有多个依赖。

  在AbListView和ListAdapter结构中:有多个AbListView派生类,也有多个ListAdapter实现。

  不管是AblistView派生出新的类还是ListAdapter派生出新的类,都不会对对方产生影响,互相修改也不会互相影响,

  AblistViewListAdapter之间是没有固定的绑定关系,很容易通过派生新的子类对应用加以扩充。

  

  综上所述,AbListView和ListAdapter结构设计应当属于Bridge模式。

Adapter模式和Bridge同属于结构性模式,结构图看似差别很大,但其实这两个模式给我感觉很相似,

通过这里的学习有一些理解了其实是有很大不同的。

Android中Adapter和Bridge模式理解和应用的更多相关文章

  1. Android中Adapter之BaseAdapter使用

    Android界面中有时候需要显示稍微复杂的界面时,就需要我们自定义一个adapter,而此adapter就要继承BaseAdapter,重新其中的方法.         Android中Adapte ...

  2. Android中的创建型模式总结

    共5种,单例模式.工厂方法模式.抽象工厂模式.建造者模式.原型模式 单例模式 定义:确保某一个类的实例只有一个,而且向其他类提供这个实例. 单例模式的使用场景:某个类的创建需要消耗大量资源,new一个 ...

  3. [转] Android中的设计模式-备忘录模式

    转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫 ...

  4. Android中Adapter总结

    根据一个制作列表的程序开始练手,结果就出现了学习安卓的第一个代码问题 运行程序发现,虽然报错,但是可以成功运行程序. Android中Adapter功能为 显示ListView,最常用的有ArrayA ...

  5. Android中常见的MVC模式

    MVC模式的简要介绍 MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller). MVC模式的目的就是实现Web系统的职能分工. Model层实现系统中的业务 ...

  6. android中对线程池的理解与使用

    前段时间有幸接到腾讯上海分公司的 Android开发面试,虽然最后一轮被毙了.但还是得总结一下自己在android开发中的一些盲点,最让我尴尬的是面试官问我几个android中线程池的使用与理解..哎 ...

  7. Android中Activity的启动模式

    简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...

  8. 【转】Android中BindService方式使用的理解

    原文网址:http://www.cnblogs.com/onlylittlegod/archive/2011/05/15/2046652.html 最近学习了一下Android里面的Service的应 ...

  9. Android中对Handle机制的理解

    一.重要參考资料  [參考资料]     眼下来看,以下的几个网址中的内容质量比較不错.基本不须要再读别的网址了. 1.android消息机制一     http://xtfncel.javaeye. ...

随机推荐

  1. 大家好 这个事我的BLOG 站点 欢迎大家 訪问和公布文章技术的 和评论 交流技术使用

    地址 http://microlmj.gotoip3.com/blog/article!showAllArticleForPageTest.action ssh+mysql+java+tomcat+b ...

  2. Java数组备忘录

    前言 近期用Java做ACM题目的时候,常常忘记数组怎样实现静态初始化,所以这里记录一下Java数组使用的常识. Java数组常识 数组在Java中是一个对象,数组实例须要通过new操作符进行创建. ...

  3. JavaWeb开发环境搭建

    Tomcat 的主要配置 Tomcat:tomcat是实现了一个JavaEE标准的最小的Webserver,是Apche组织开发的,免费的server,能够在网络中直接下载. 最新的版本号应该是8的版 ...

  4. ZOJ2599:Graduated Lexicographical Ordering(很经典的数位DP)

    Consider integer numbers from 1 to n. Let us call the sum of digits of an integer number its weight. ...

  5. Python&amp;MySQL

    环境:windows8+Python2.7+MySQL5.6 尝试过在C/C++中嵌入SQL语言,最终在其复杂"繁琐"环境配置中败下阵来,后来发现Python和MySQL比較eas ...

  6. tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37410571 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  7. css list menu

    选择让page和folder都显示出来

  8. YTU 2706: 编写一个函数求最大的n值

    2706: 编写一个函数求最大的n 值. 时间限制: 1 Sec  内存限制: 128 MB 提交: 341  解决: 132 题目描述 编写一个函数求满足以下条件的最大的n.:12+22+32+-+ ...

  9. VS2010 使用TeeChart绘图控件 - 之一 - 控件和类的导入

    vs2010的用法和vc6有很大的不同,特别是在一些函数调用那里,当然.控件导入也是很不一样的 安装好控件后就可以在工程里加入teechart控件了 加入方法有如下几种: 1.添加Teechart控件 ...

  10. 解决UTF-8方法归纳

    1:通过spring配置过滤器解决 <!-- 配置Spring提供的字符编码过滤器 --> <filter> <filter-name>SpringCharacte ...