91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶(hù)?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>電子百科>通信技術(shù)>傳輸網(wǎng)/接入網(wǎng)/交換網(wǎng)>

適配器模式的應(yīng)用

2018年01月12日 14:28 網(wǎng)絡(luò)整理 作者: 用戶(hù)評(píng)論(0

適配器模式

在計(jì)算機(jī)編程中,適配器模式(有時(shí)候也稱(chēng)包裝樣式或者包裝)將一個(gè)類(lèi)的接口適配成用戶(hù)所期待的。一個(gè)適配允許通常因?yàn)榻涌诓患嫒荻荒茉谝黄鸸ぷ鞯念?lèi)工作在一起,做法是將類(lèi)自己的接口包裹在一個(gè)已存在的類(lèi)中。

下面是類(lèi)適配器的UML圖:

(2)對(duì)象適配器:

對(duì)象適配器”通過(guò)組合除了滿(mǎn)足“用戶(hù)期待接口”還降低了代碼間的不良耦合。在工作中推薦使用“對(duì)象適配”。下面是對(duì)象適配器的UML圖:

(3) 缺省適配器模式:

缺省適配器模式是一種特殊的適配器模式,但這個(gè)適配器是由一個(gè)抽象類(lèi)實(shí)現(xiàn)的,并且在抽象類(lèi)中要實(shí)現(xiàn)目標(biāo)接口中所規(guī)定的所有方法,但很多方法的實(shí)現(xiàn)都是“平庸”的實(shí)現(xiàn),也就是說(shuō),這些方法都是空方法。而具體的子類(lèi)都要繼承此抽象類(lèi)。

一 概述

定義:適配器模式將某個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)端期望的另一個(gè)接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個(gè)類(lèi)可以協(xié)同工作。其別名為包裝器(Wrapper)。

屬于結(jié)構(gòu)型模式

主要分為三類(lèi):類(lèi)適配器模式、對(duì)象的適配器模式、接口的適配器模式。

本文定義:

需要被適配的類(lèi)、接口、對(duì)象(我們有的),簡(jiǎn)稱(chēng) src(source)

最終需要的輸出(我們想要的),簡(jiǎn)稱(chēng) dst (destination,即Target)

適配器稱(chēng)之為 Adapter 。

一句話(huà)描述適配器模式的感覺(jué): src-》Adapter-》dst,即src以某種形式(三種形式分別對(duì)應(yīng)三種適配器模式)給到Adapter里,最終轉(zhuǎn)化成了dst。

拿我們Android開(kāi)發(fā)最熟悉的展示列表數(shù)據(jù)的三大控件:ListView,GridView,RecyclerView的Adapter來(lái)說(shuō),它們?nèi)齻€(gè)控件需要的是View(dst),而我們有的一般是datas(src),所以適配器Adapter就是完成了數(shù)據(jù)源datas 轉(zhuǎn)化成 ItemView的工作。

帶入src-》Adapter-》dst中,即datas-》Adapter-》View.

使用場(chǎng)景:

1 系統(tǒng)需要使用現(xiàn)有的類(lèi),而這些類(lèi)的接口不符合系統(tǒng)的需要。

2 想要建立一個(gè)可以重復(fù)使用的類(lèi),用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的一些類(lèi),包括一些可能在將來(lái)引進(jìn)的類(lèi)一起工作。

3 需要一個(gè)統(tǒng)一的輸出接口,而輸入端的類(lèi)型不可預(yù)知。

二 類(lèi)適配器模式:

一句話(huà)描述:Adapter類(lèi),通過(guò)繼承 src類(lèi),實(shí)現(xiàn) dst 類(lèi)接口,完成src-》dst的適配。

別的文章都用生活中充電器的例子來(lái)講解適配器,的確,這是個(gè)極佳的舉例,本文也不能免俗:

充電器本身相當(dāng)于Adapter,220V交流電相當(dāng)于src,我們的目dst標(biāo)是5V直流電。

我們現(xiàn)有的src類(lèi):

public class Voltage220 {

public int output220V() {

int src = 220;

System.out.println(“我是” + src + “V”);

return src;

}

}1234567891011121314

我們想要的dst接口:

public interface Voltage5 {

int output5V();

}

1234567891011

適配器類(lèi):

public class VoltageAdapter extends Voltage220 implements Voltage5 {

@Override

public int output5V() {

int src = output220V();

System.out.println(“適配器工作開(kāi)始適配電壓”);

int dst = src / 44;

System.out.println(“適配完成后輸出電壓:” + dst);

return dst;

}

}123456789101112131415161718

Client類(lèi):

public class Mobile {

/**

* 充電方法

*

* @param voltage5

*/

public void charging(Voltage5 voltage5) {

if (voltage5.output5V() == 5) {

System.out.println(“電壓剛剛好5V,開(kāi)始充電”);

} else if (voltage5.output5V() 》 5) {

System.out.println(“電壓超過(guò)5V,都閃開(kāi) 我要變成note7了”);

}

}

}123456789101112131415161718192021

測(cè)試代碼:

System.out.println(“===============類(lèi)適配器==============”);

Mobile mobile = new Mobile();

mobile.charging(new VoltageAdapter());123

輸出:

===============類(lèi)適配器==============

我是220V

適配器工作開(kāi)始適配電壓

適配完成后輸出電壓:5

電壓剛剛好5V,開(kāi)始充電12345

類(lèi)圖如下:

適配器模式的應(yīng)用

小結(jié):

Java這種單繼承的機(jī)制,所有需要繼承的我個(gè)人都不太喜歡。

所以類(lèi)適配器需要繼承src類(lèi)這一點(diǎn)算是一個(gè)缺點(diǎn),

因?yàn)檫@要求dst必須是接口,有一定局限性;

且src類(lèi)的方法在Adapter中都會(huì)暴露出來(lái),也增加了使用的成本。

但同樣由于其繼承了src類(lèi),所以它可以根據(jù)需求重寫(xiě)src類(lèi)的方法,使得Adapter的靈活性增強(qiáng)了。

三 對(duì)象適配器模式(常用):

基本思路和類(lèi)的適配器模式相同,只是將Adapter類(lèi)作修改,這次不繼承src類(lèi),而是持有src類(lèi)的實(shí)例,以解決兼容性的問(wèn)題。

即:持有 src類(lèi),實(shí)現(xiàn) dst 類(lèi)接口,完成src-》dst的適配。

(根據(jù)“合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系來(lái)替代繼承關(guān)系,因此大部分結(jié)構(gòu)型模式都是對(duì)象結(jié)構(gòu)型模式。)

Adapter類(lèi)如下:

public class VoltageAdapter2 implements Voltage5 {

private Voltage220 mVoltage220;

public VoltageAdapter2(Voltage220 voltage220) {

mVoltage220 = voltage220;

}

@Override

public int output5V() {

int dst = 0;

if (null != mVoltage220) {

int src = mVoltage220.output220V();

System.out.println(“對(duì)象適配器工作,開(kāi)始適配電壓”);

dst = src / 44;

System.out.println(“適配完成后輸出電壓:” + dst);

}

return dst;

}

}123456789101112131415161718192021222324252627

測(cè)試代碼:

System.out.println(“\n===============對(duì)象適配器==============”);

VoltageAdapter2 voltageAdapter2 = new VoltageAdapter2(new Voltage220());

Mobile mobile2 = new Mobile();

mobile2.charging(voltageAdapter2);1234

輸出:

===============對(duì)象適配器==============

我是220V

對(duì)象適配器工作,開(kāi)始適配電壓

適配完成后輸出電壓:5

電壓剛剛好5V,開(kāi)始充電12345

類(lèi)圖:

適配器模式的應(yīng)用

小結(jié):

對(duì)象適配器和類(lèi)適配器其實(shí)算是同一種思想,只不過(guò)實(shí)現(xiàn)方式不同。

根據(jù)合成復(fù)用原則,組合大于繼承,

所以它解決了類(lèi)適配器必須繼承src的局限性問(wèn)題,也不再?gòu)?qiáng)求dst必須是接口。

同樣的它使用成本更低,更靈活。

(和裝飾者模式初學(xué)時(shí)可能會(huì)弄混,這里要搞清,裝飾者是對(duì)src的裝飾,使用者毫無(wú)察覺(jué)到src已經(jīng)被裝飾了(使用者用法不變)。 這里對(duì)象適配以后,使用者的用法還是變的。

即,裝飾者用法: setSrc-》setSrc,對(duì)象適配器用法:setSrc-》setAdapter.)

四 接口適配器模式

也有文獻(xiàn)稱(chēng)之為認(rèn)適配器模式(Default Adapter Pattern)或缺省適配器模式。

定義:

當(dāng)不需要全部實(shí)現(xiàn)接口提供的方法時(shí),可先設(shè)計(jì)一個(gè)抽象類(lèi)實(shí)現(xiàn)接口,并為該接口中每個(gè)方法提供一個(gè)默認(rèn)實(shí)現(xiàn)(空方法),那么該抽象類(lèi)的子類(lèi)可有選擇地覆蓋父類(lèi)的某些方法來(lái)實(shí)現(xiàn)需求,它適用于一個(gè)接口不想使用其所有的方法的情況。

我們直接進(jìn)入大家最喜愛(ài)的源碼撐腰環(huán)節(jié):

源碼撐腰環(huán)節(jié):

Android中的屬性動(dòng)畫(huà)ValueAnimator類(lèi)可以通過(guò)addListener(AnimatorListener listener)方法添加監(jiān)聽(tīng)器,

那么常規(guī)寫(xiě)法如下:

ValueAnimator valueAnimator = ValueAnimator.ofInt(0,100);

valueAnimator.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animation) {

}

@Override

public void onAnimationEnd(Animator animation) {

}

@Override

public void onAnimationCancel(Animator animation) {

}

@Override

public void onAnimationRepeat(Animator animation) {

}

});

valueAnimator.start();1234567891011121314151617181920212223

有時(shí)候我們不想實(shí)現(xiàn)Animator.AnimatorListener接口的全部方法,我們只想監(jiān)聽(tīng)onAnimationStart,我們會(huì)如下寫(xiě):

ValueAnimator valueAnimator = ValueAnimator.ofInt(0,100);

valueAnimator.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationStart(Animator animation) {

//xxxx具體實(shí)現(xiàn)

}

});

valueAnimator.start();12345678

顯然,這個(gè)AnimatorListenerAdapter類(lèi),就是一個(gè)接口適配器。

查看該Adapter類(lèi)源碼:

public abstract class AnimatorListenerAdapter implements Animator.AnimatorListener,

Animator.AnimatorPauseListener {

@Override

public void onAnimationCancel(Animator animation) {

}

@Override

public void onAnimationEnd(Animator animation) {

}

@Override

public void onAnimationRepeat(Animator animation) {

}

@Override

public void onAnimationStart(Animator animation) {

}

@Override

public void onAnimationPause(Animator animation) {

}

@Override

public void onAnimationResume(Animator animation) {

}

}1234567891011121314151617181920212223242526

可見(jiàn),它空實(shí)現(xiàn)了Animator.AnimatorListener類(lèi)(src)的所有方法。

對(duì)應(yīng)的src類(lèi):

public static interface AnimatorListener {

void onAnimationStart(Animator animation);

void onAnimationEnd(Animator animation);

void onAnimationCancel(Animator animation);

void onAnimationRepeat(Animator animation);

}123456789

類(lèi)圖:

適配器模式的應(yīng)用

我們程序里的匿名內(nèi)部類(lèi)就是Listener1 2 這種具體實(shí)現(xiàn)類(lèi)。

new AnimatorListenerAdapter() {

@Override

public void onAnimationStart(Animator animation) {

//xxxx具體實(shí)現(xiàn)

}

}123456

接口適配器模式很好理解,令我們的程序更加簡(jiǎn)潔明了。

五 總結(jié)

我個(gè)人理解,三種命名方式,是根據(jù) src是以怎樣的形式給到Adapter(在Adapter里的形式)來(lái)命名的。

類(lèi)適配器,以類(lèi)給到,在Adapter里,就是將src當(dāng)做類(lèi),繼承,

對(duì)象適配器,以對(duì)象給到,在Adapter里,將src作為一個(gè)對(duì)象,持有。

接口適配器,以接口給到,在Adapter里,將src作為一個(gè)接口,實(shí)現(xiàn)。

Adapter模式最大的作用還是將原本不兼容的接口融合在一起工作。

但是在實(shí)際開(kāi)發(fā)中,實(shí)現(xiàn)起來(lái)不拘泥于本文介紹的三種經(jīng)典形式,

例如Android中ListView、GridView的適配器Adapter,就不是以上三種經(jīng)典形式之一,

我個(gè)人理解其屬于對(duì)象適配器模式,一般日常使用中,我們都是在Adapter里持有datas,然后通過(guò)getView()/onCreateViewHolder()方法向ListView/RecyclerView提供View/ViewHolder。

Client是Lv Gv Rv ,它們是顯示View的類(lèi)。

所以dst(Target)是View。

一般來(lái)說(shuō)我們有的src是數(shù)據(jù)datas,

即,我們希望:datas(src)-》Adapter-》View(dst)-》Rv(Client)。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

( 發(fā)表人:龔婷 )

      發(fā)表評(píng)論

      用戶(hù)評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?