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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容