美文网首页
11.3设计模式-适配器-详解

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

作者: 205蚁 | 来源:发表于2018-11-18 17:19 被阅读0次

    设计模式-适配器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设计模式-适配器-详解

          本文链接:https://www.haomeiwen.com/subject/pipgfqtx.html