適配器模式的優(yōu)缺點(diǎn)
適配器是一個(gè)接口轉(zhuǎn)換器,它可以是一個(gè)獨(dú)立的硬件接口設(shè)備,允許硬件或電子接口與其它硬件或電子接口相連,也可以是信息接口。比如:電源適配器、三角架基座轉(zhuǎn)接部件、USB與串口的轉(zhuǎn)接設(shè)備等。
一臺(tái)實(shí)驗(yàn)室離心機(jī)通??梢耘涠鄠€(gè)轉(zhuǎn)子,容量大小不一。當(dāng)在同一臺(tái)離心機(jī)需要配同一種類(lèi)但容量不一的兩個(gè)轉(zhuǎn)子時(shí),可以考慮在大容量的試管孔里放一個(gè)適配器以達(dá)到適合小容量試管的試管孔,這樣就只需要配上大容量的轉(zhuǎn)子加上一套適配器就可以滿足要求了,這樣既可以免除換轉(zhuǎn)子時(shí)拆卸的復(fù)雜工序,又節(jié)約金錢(qián),因?yàn)橐惶走m配器的價(jià)格遠(yuǎn)遠(yuǎn)低一個(gè)轉(zhuǎn)子的價(jià)格。
適配器模式的優(yōu)缺點(diǎn)
Java 適配器模式
適配器模式就是把一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶端所期待的另外一種接口,從而使原接口不匹配而無(wú)法在一起工作的的兩個(gè)類(lèi)能在一起工作。從功能上說(shuō),這些接口不兼容的類(lèi)一般具有相同或相似的功能。通常我們通過(guò)修改該類(lèi)的接口來(lái)解決這種接口不兼容的情形,但是如果我們不愿意為了一個(gè)應(yīng)用而修改各原接口,或者我們壓根兒就沒(méi)有對(duì)象的源代碼的時(shí)候,適配器模式就會(huì)派上用場(chǎng)了。
適配器的優(yōu)點(diǎn):
1、將目標(biāo)類(lèi)和適配者類(lèi)解耦
2、增加了類(lèi)的透明性和復(fù)用性,將具體的實(shí)現(xiàn)封裝在適配者類(lèi)中,對(duì)于客戶端類(lèi)來(lái)說(shuō)是透明的,而且提高了適配者的復(fù)用性
3、靈活性和擴(kuò)展性都非常好,符合開(kāi)閉原則
適配器所涉及的角色包括下面幾種:
目標(biāo)(Target):定義一個(gè)客戶端使用的特定接口。
客戶端(Client):使用目標(biāo)接口,與和目標(biāo)接口一致的對(duì)象合作。
被適配者(Adaptee):一個(gè)現(xiàn)存需要適配的接口。
適配器(Adapter):負(fù)責(zé)將Adaptee的接口轉(zhuǎn)換為T(mén)arget的接口。適配器是一個(gè)具體的類(lèi),這是該模式的核心。
適配器分為類(lèi)適配器和對(duì)象適配器兩種,下面將詳細(xì)講述。
類(lèi)適配器
所謂類(lèi)適配器,指的是適配器Adapter繼承我們的被適配者Adaptee,并實(shí)現(xiàn)目標(biāo)接口Target。由于Java中是單繼承,所以這個(gè)適配器僅僅只能服務(wù)于所繼承的被適配者Adaptee。代碼如下:
被適配者(Adaptee)
16package com.bluemsun.classadapter;
public class Person {
private int id;
private String name;
/**
* person可以現(xiàn)在只能說(shuō)英語(yǔ)
*/
public void sayEnglish(){
System.out.println(“Person can say english!”);
}
/**
* 省略setter,getter.
*/
}
目標(biāo)接口(Target)
package com.bluemsun.classadapter;
/**
* 目標(biāo)要求person可以說(shuō)英語(yǔ),法語(yǔ),日語(yǔ)。但是現(xiàn)在的person僅僅可以說(shuō)英語(yǔ)
* @author Administrator
*
*/
public interface Target_Person {
void sayEnglish();
void sayFrench();
void sayJapanese();
}
適配器(Adapter)
package com.bluemsun.classadapter;
/**
* 類(lèi)適配器,因?yàn)槔^承了Person,而Java中只能單繼承,所以這個(gè)適配器只為person這一個(gè)類(lèi)服務(wù)
* 這個(gè)適配器就讓person類(lèi)在不修改源碼的基礎(chǔ)上能實(shí)現(xiàn)目標(biāo)接口所指定的方法
* @author Administrator
*
*/
public class Adapter_Person extends Person implements Target_Person{
@Override
public void sayFrench() {
System.out.println(“Person can say French!”);
}
@Override
public void sayJapanese() {
System.out.println(“Person can say Japanese!”);
}
}
客戶端(Client)
package com.bluemsun.classadapter;
public class Test {
public staTIc void main(String[] args) {
Target_Person person = new Adapter_Person();
person.sayEnglish();
person.sayFrench();
person.sayJapanese();
}
}
上面的幾段簡(jiǎn)單代碼演示了類(lèi)適配器的作用。正如我們開(kāi)始所言,這個(gè)適配器Adapter只能為Person這一個(gè)類(lèi)所服務(wù)。這時(shí)候你可能會(huì)想,要是我所需要適配的類(lèi)很多,是不是都需要為每一個(gè)需要適配的類(lèi)寫(xiě)一個(gè)Adapter?有沒(méi)有更加靈活的方式呢?答案是:有!就是我們下面所講的對(duì)象適配器。
對(duì)象適配器
所謂對(duì)象適配器,簡(jiǎn)單的說(shuō)就是適配器實(shí)現(xiàn)我們的目標(biāo)接口,但是并不繼承需要被適配的類(lèi)。而是通過(guò)在適配器的構(gòu)造函數(shù)中將需要被適配的類(lèi)傳遞進(jìn)來(lái)從而進(jìn)行適配。代碼如下:(Target,Adaptee同上)
適配器(Adapter)
package com.bluemsun.objectdapter;
import com.bluemsun.classadapter.Person;
import com.bluemsun.classadapter.Target_Person;
/**
* 對(duì)象適配器,與類(lèi)適配器不同的是:對(duì)象適配器可以適配多個(gè)源到目標(biāo)
* @author Administrator
*
*/
public class Adapter_Person implements Target_Person{ //僅僅實(shí)現(xiàn)目標(biāo)接口
private Person person;
//在構(gòu)造函數(shù)中將Adaptee類(lèi)Person傳遞進(jìn)來(lái)
public Adapter_Person(Person person){
this.person = person;
}
//實(shí)現(xiàn)目標(biāo)接口中的sayEnglish()--調(diào)用Adaptee中的sayEnglish()
@Override
public void sayEnglish() {
this.person.sayEnglish();
}
//實(shí)現(xiàn)接口中的其它方法
@Override
public void sayFrench() {
System.out.println(“person can say French!”);
}
@Override
public void sayJapanese() {
System.out.println(“person can say Japanese!”);
}
}
客戶端(Client)
package com.bluemsun.objectdapter;
import com.bluemsun.classadapter.Person;
import com.bluemsun.classadapter.Target_Person;
public class Test {
public staTIc void main(String[] args) {
Target_Person person = new Adapter_Person(new Person());
person.sayEnglish();
person.sayFrench();
person.sayJapanese();
}
}
對(duì)象適配器可以適配多個(gè)帶適配的類(lèi)。只需要你在Adapter的構(gòu)造方法中傳遞不同的帶適配的類(lèi)即可。具有靈活性。
類(lèi)適配器的優(yōu)點(diǎn):
1、由于適配器類(lèi)是適配者類(lèi)的子類(lèi),因此可以再適配器類(lèi)中置換一些適配者的方法,使得適配器的靈活性更強(qiáng)。
類(lèi)適配器的缺點(diǎn):
1、對(duì)于Java、C#等不支持多重繼承的語(yǔ)言,一次最多只能適配一個(gè)適配者類(lèi),而且目標(biāo)抽象類(lèi)只能為接口,不能為類(lèi),其使用有一定的局限性,不能將一個(gè)適配者類(lèi)和他的子類(lèi)同時(shí)適配到目標(biāo)接口。
對(duì)象適配器的優(yōu)點(diǎn):
1、把多個(gè)不同的適配者適配到同一個(gè)目標(biāo),也就是說(shuō),同一個(gè)適配器可以把適配者類(lèi)和他的子類(lèi)都適配到目標(biāo)接口。
對(duì)象適配器的缺點(diǎn):
1、與類(lèi)適配器模式相比,要想置換適配者類(lèi)的方法就不容易。
下一篇:MacBook電源適配器拆解
- 被動(dòng)元件缺料漲價(jià)災(zāi)情慘烈,部分代工廠商或面臨倒閉危機(jī)[18年05月16日 10:04]
- 綠聯(lián)無(wú)線充電器評(píng)測(cè)_性價(jià)比爆棚價(jià)格實(shí)惠[18年05月19日 14:38]
- 基于i.MX6UL處理器的上電時(shí)序設(shè)計(jì)[18年05月19日 14:36]
- 綠聯(lián)無(wú)線充電器怎么樣_綠聯(lián)無(wú)線充電器拆解詳情[18年05月19日 14:14]
- 綠聯(lián)qc3.0快速充電器評(píng)測(cè)(外觀、性能、兼容測(cè)試)[18年05月19日 14:06]
- 電源重新上電引起的MCU啟動(dòng)失敗的原因分析[18年05月19日 14:04]