11.3设计模式-适配器-详解

设计模式-适配器adapter模式

    1. adapter模式详解
    1. 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

你可能感兴趣的:(11.3设计模式-适配器-详解)