设计模式-适配器adapter模式
- adapter模式详解
-
adapter模式在android中的实际运用
1.listview用的adapter 、recyclerView 2.viewpager 3.java中的spring也用的多
11_1-11-7[00_50_58][20180731-232020-2].jpg
-
1.adapter模式详解
1.适配器模式定义
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(wrapper)
适用场景:
1.需要接口转换
2.需要重复使用的类,同时重复的类彼此之间又没有相同关系的。
2.类适配器
1.类适配器定义
类的适配器模式将适配的类的API转换成为目标类的API
2.UML结构图解释
图:
《interface》
Target(目标接口) Adaptee(不满足要求的接口)
-------------- --------------
+sampleOperation1():void +sampleOperation1():void
+sampleOperation2():void
Adapter
----------------------
-adaptee :Adaptee
----------------------
+Adapter();
+sampleOperation1():void
+sampleOperation2():void
Adaptee这个类并没有接口(目标接口,客户想要的功能) sampleOperation2这个方法
而我们需要 这个方法,为了让客户端能用到该方法,同时又能使用adaptee这个类,所以提供了适配器中间环节,将Target和adaptee连接起来。同时非常重要的一点,Adapter和Adaptee是继承关系,这是类适配器的特点
UML图可是看出 继承不兼容类,实现接口-->将不兼容类适配给客户 可用
总结:
1.类适配器使用对象继承的方式,是静态的定义方式
2.对于类适配器,适配器可以重新定义Adaptee的部分行为
3.对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee
4.对于类适配器,由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作
3.对象适配器
1.对象适配器定义
2.UML结构图解释
3.code详解
4.总结
1.对象适配器定义
与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象适配器模式不是使用的继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。
《interface》
Target(目标接口) Adaptee(不满足要求的类)
-------------- --------------
+sampleOperation1():void +sampleOperation1():void
+sampleOperation2():void
Adapter
----------------------
-adaptee :Adaptee(对象适配器无)
----------------------
+Adapter();
+sampleOperation1():void (对象适配器无)
+sampleOperation2():void
图:
Adapter实现了目标接口,持有了被适配类的对象引用(而不是继承)
适配器Adapter构造方法 需要传入参数Adaptee
public class Adapter implements Target{
private Adaptee mAdapteee;
public Adapter(Adaptee adaptee){mAdaptee = adaptee;}
public void simpleOperation1(){adaptee.xxx()}
public void simpleOperation2(){//空实现}
}
2.UML结构图解释
3.code详解
4.总结
对象适配器使用对象组合的方式,是动态组合的方式。
对于对象适配器,一个适配器可以把多种不同的源 适配到同一个目标
对于对象适配器而言,要重定义Adaptee的行为比较困难,不像继承可以重写
对于对象适配器,需要额外的引用来间接得到 被适配对象Adaptee
2.adapter模式在android中的实际运用
1.listview用的
1.UI
图
Data Source--> <-- Adapter --> <-- ListView
|
| |
Cursor ArrayList
ListView是将各种各样的数据源显示成 各种各这样的ItemView,
由于每一个我们想要显示的效果是不相同的,同时要显示的Data Source 以及他们的数量也是千变万化的,如何应对这种变化。
在 数据层 和View层 中间增加一个Adapter 来隔离变化。
将ListView所需要的关于ItemView的接口 抽象到Adapter 当中,并且ListView内部调用Adpater接口来完成我们整个数据和布局的显示操作。
操作:主要实现BaseAdapter接口,将adapter设置给listViw,通过setAdapter方法。这样ListView'可以按照我们想要的UI效果,数量显示每个Item。
ListView最重要的问题,解决每一项Item的数据输出,Item它的View 是个性化定制,但根本 它是一个View。
--->adapter 作用:1.封装数据 2.统一我们的ItemView,输出View类型。这样就很好的处理了ItemView千变万化的特征性。
UI总结:
1.ListView 是由一条条的Item组成的,这每一条Item又是一个View。通过Adapter适配器这个桥梁将Viwe添加到ListView中。
2.一个Adapter是AdapterView 视图与数据之间的桥梁,Adapter提供对数据的访问,也负责为每一项数据产生对应的View
3.每一项数据产生对应的View之后,然后将View添加到ListView之中
4.MVC接口。Adapter是controller,将数据源转换成View
2.源码
图:
ListView:
无Adapter的成员变量,放到了父类中AbsListView
AbsListView
方法 void onAttachedToWindow();当我们的View关联到指定的Window时调用
方法底部调用了 mItemCount = mAdapter.getCount(); ---需要重写的方法之一
这之上new 了一个观察者
mDataSetObserver = new AdapterDataSetObserver();//观察者
aAdapter.registerDataSetObserver(mDataSetObserver);
这里是适配器和观察者结合使用
--->当数据源发生变化时,会通过适配器来通知整个观察者来去做相应的UI改变
onLayout方法中:
会调用void layoutChildren(){空实现},在子类ListView中实现
ListView的
layoutChildren(){}非常长
随便看一个方法fillUp(int pos,int nextBottom) 从布局上开始填充
makeAndAddview(int postion,int y,boolean flow,int childrenLeft,boolean selected)//方法
这里的View是ListView中的每一个ItemView,positon是位置
1.获得View final View child = obtainView(position,mIsScrop)
2.设置View 布局到特定的位置
setupChild(child,position,y,flow,childrenLeft,selected,mIsScrop[0])
图:
final View scrapView = mRecycler.getScrapView(position);
final View child = mAdapter.getView(position,scrapView,this);
11_1-11-7[00_50_58][20180731-232020-2].jpg
11_1-11-7[00_59_03][20180801-084247-3].jpg
11_1-11-7[01_03_25][20180801-204435-4].jpg
11_1-11-7[01_06_57][20180801-205543-5].jpg
11_1-11-7[01_09_47][20180801-210314-6].jpg
11_1-11-7[01_09_50][20180801-210341-7].jpg
11_1-11-7[01_11_12][20180801-211017-0].jpg
11_1-11-7[01_12_20][20180801-211133-1].jpg
11_1-11-7[01_13_47][20180801-211148-2].jpg
网友评论