11.3設(shè)計模式-適配器-詳解

設(shè)計模式-適配器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.適配器模式定義
    將一個接口轉(zhuǎn)換成客戶希望的另一個接口缠黍,適配器模式使接口不兼容的那些類可以一起工作揍瑟,其別名為包裝器(wrapper)
    
    適用場景:
    1.需要接口轉(zhuǎn)換 
    2.需要重復(fù)使用的類少欺,同時重復(fù)的類彼此之間又沒有相同關(guān)系的喳瓣。
2.類適配器
    1.類適配器定義
        類的適配器模式將適配的類的API轉(zhuǎn)換成為目標(biāo)類的API
    2.UML結(jié)構(gòu)圖解釋
        圖:
            《interface》                          
                Target(目標(biāo)接口)                Adaptee(不滿足要求的接口)
            --------------                         --------------
            +sampleOperation1():void             +sampleOperation1():void
            +sampleOperation2():void
            
            
            Adapter
            ----------------------
            -adaptee :Adaptee
            ----------------------
            +Adapter();
            +sampleOperation1():void 
            +sampleOperation2():void
            
        Adaptee這個類并沒有接口(目標(biāo)接口,客戶想要的功能) sampleOperation2這個方法
        而我們需要 這個方法赞别,為了讓客戶端能用到該方法畏陕,同時又能使用adaptee這個類,所以提供了適配器中間環(huán)節(jié)仿滔,將Target和adaptee連接起來惠毁。同時非常重要的一點,Adapter和Adaptee是繼承關(guān)系,這是類適配器的特點
        
        UML圖可是看出 繼承不兼容類崎页,實現(xiàn)接口-->將不兼容類適配給客戶 可用
        
    總結(jié):
        1.類適配器使用對象繼承的方式鞠绰,是靜態(tài)的定義方式
        2.對于類適配器,適配器可以重新定義Adaptee的部分行為
        3.對于類適配器飒焦,僅僅引入了一個對象蜈膨,并不需要額外的引用來間接得到Adaptee
        4.對于類適配器,由于適配器直接繼承了Adaptee牺荠,使得適配器不能和Adaptee的子類一起工作
        
3.對象適配器 
    1.對象適配器定義
    2.UML結(jié)構(gòu)圖解釋
    3.code詳解
    4.總結(jié)

    1.對象適配器定義
        與類的適配器模式一樣翁巍,對象的適配器模式把被適配的類的API轉(zhuǎn)換成為目標(biāo)類的API,與類的適配器模式不同的是休雌,對象適配器模式不是使用的繼承關(guān)系連接到Adaptee類曙咽,而是使用委派關(guān)系連接到Adaptee類。
        
                        《interface》                          
                Target(目標(biāo)接口)                Adaptee(不滿足要求的類)
            --------------                         --------------
            +sampleOperation1():void             +sampleOperation1():void
            +sampleOperation2():void
            
            
            Adapter
            ----------------------
            -adaptee :Adaptee(對象適配器無)
            ----------------------
            +Adapter();
            +sampleOperation1():void (對象適配器無)
            +sampleOperation2():void
            
        圖:
            Adapter實現(xiàn)了目標(biāo)接口挑辆,持有了被適配類的對象引用(而不是繼承)
            適配器Adapter構(gòu)造方法 需要傳入?yún)?shù)Adaptee
            public class Adapter implements Target{
                private Adaptee mAdapteee;
                public Adapter(Adaptee adaptee){mAdaptee = adaptee;}
                public void simpleOperation1(){adaptee.xxx()}
                public void simpleOperation2(){//空實現(xiàn)}
            }
             
    2.UML結(jié)構(gòu)圖解釋
    3.code詳解
    4.總結(jié)
        對象適配器使用對象組合的方式,是動態(tài)組合的方式孝情。
        對于對象適配器鱼蝉,一個適配器可以把多種不同的源 適配到同一個目標(biāo)
        對于對象適配器而言,要重定義Adaptee的行為比較困難箫荡,不像繼承可以重寫
        對于對象適配器魁亦,需要額外的引用來間接得到 被適配對象Adaptee

2.adapter模式在android中的實際運用

1.listview用的
    1.UI
        圖
        Data Source--> <--  Adapter --> <-- ListView
             |
           |   |
       Cursor  ArrayList
       
       ListView是將各種各樣的數(shù)據(jù)源顯示成 各種各這樣的ItemView,
       由于每一個我們想要顯示的效果是不相同的羔挡,同時要顯示的Data Source 以及他們的數(shù)量也是千變?nèi)f化的洁奈,如何應(yīng)對這種變化。
       
       在 數(shù)據(jù)層  和View層  中間增加一個Adapter 來隔離變化绞灼。
       
       將ListView所需要的關(guān)于ItemView的接口 抽象到Adapter 當(dāng)中利术,并且ListView內(nèi)部調(diào)用Adpater接口來完成我們整個數(shù)據(jù)和布局的顯示操作。
       
       操作:主要實現(xiàn)BaseAdapter接口低矮,將adapter設(shè)置給listViw印叁,通過setAdapter方法。這樣ListView'可以按照我們想要的UI效果,數(shù)量顯示每個Item轮蜕。
       ListView最重要的問題昨悼,解決每一項Item的數(shù)據(jù)輸出,Item它的View 是個性化定制跃洛,但根本 它是一個View率触。
       --->adapter 作用:1.封裝數(shù)據(jù) 2.統(tǒng)一我們的ItemView,輸出View類型汇竭。這樣就很好的處理了ItemView千變?nèi)f化的特征性葱蝗。
       
      UI總結(jié):
      1.ListView 是由一條條的Item組成的,這每一條Item又是一個View韩玩。通過Adapter適配器這個橋梁將Viwe添加到ListView中垒玲。
      2.一個Adapter是AdapterView 視圖與數(shù)據(jù)之間的橋梁,Adapter提供對數(shù)據(jù)的訪問找颓,也負(fù)責(zé)為每一項數(shù)據(jù)產(chǎn)生對應(yīng)的View
      3.每一項數(shù)據(jù)產(chǎn)生對應(yīng)的View之后合愈,然后將View添加到ListView之中
      4.MVC接口。Adapter是controller击狮,將數(shù)據(jù)源轉(zhuǎn)換成View
      
           
    2.源碼
        圖:
        ListView:
            無Adapter的成員變量佛析,放到了父類中AbsListView
        AbsListView
            方法 void onAttachedToWindow();當(dāng)我們的View關(guān)聯(lián)到指定的Window時調(diào)用
                方法底部調(diào)用了 mItemCount = mAdapter.getCount(); ---需要重寫的方法之一
                
                這之上new 了一個觀察者
                    mDataSetObserver = new AdapterDataSetObserver();//觀察者
                    aAdapter.registerDataSetObserver(mDataSetObserver); 
                        這里是適配器和觀察者結(jié)合使用
                    --->當(dāng)數(shù)據(jù)源發(fā)生變化時,會通過適配器來通知整個觀察者來去做相應(yīng)的UI改變 
            onLayout方法中:
                會調(diào)用void layoutChildren(){空實現(xiàn)}彪蓬,在子類ListView中實現(xiàn)
        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.設(shè)置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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膘茎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酷誓,更是在濱河造成了極大的恐慌披坏,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盐数,死亡現(xiàn)場離奇詭異棒拂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)玫氢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門帚屉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漾峡,你說我怎么就攤上這事攻旦。” “怎么了生逸?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵敬特,是天一觀的道長掰邢。 經(jīng)常有香客問我,道長伟阔,這世上最難降的妖魔是什么辣之? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮皱炉,結(jié)果婚禮上怀估,老公的妹妹穿的比我還像新娘。我一直安慰自己合搅,他們只是感情好多搀,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灾部,像睡著了一般康铭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赌髓,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天从藤,我揣著相機(jī)與錄音,去河邊找鬼锁蠕。 笑死夷野,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荣倾。 我是一名探鬼主播悯搔,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舌仍!你這毒婦竟也來了妒貌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铸豁,失蹤者是張志新(化名)和其女友劉穎灌曙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體推姻,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年框沟,在試婚紗的時候發(fā)現(xiàn)自己被綠了藏古。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡忍燥,死狀恐怖拧晕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梅垄,我是刑警寧澤厂捞,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響靡馁,放射性物質(zhì)發(fā)生泄漏欲鹏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一臭墨、第九天 我趴在偏房一處隱蔽的房頂上張望赔嚎。 院中可真熱鬧,春花似錦胧弛、人聲如沸尤误。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽损晤。三九已至,卻和暖如春红竭,著一層夾襖步出監(jiān)牢的瞬間尤勋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工德崭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留斥黑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓眉厨,卻偏偏與公主長得像锌奴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子憾股,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容