適配器模式
適配器模式(Adapter Pattern)是作為兩個(gè)不兼容的接口之間的橋梁。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它結(jié)合了兩個(gè)獨(dú)立接口的功能。
這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)加入獨(dú)立的或不兼容的接口功能。舉個(gè)真實(shí)的例子,手機(jī)充電需要5v,電源是交流的220v,我們使用適配器來(lái)充電.
需要被適配的類
public class Voltages220v {
public int output220V() {
int src = 220;
System.out.println ("電壓" + src + "v");
return src;
}
}
真正的使用者
public class Phone {
public void charging(Voltage5V voltage5V){
if(voltage5V.output ()==5){
System.out.println ("電壓為5v可以充電");
}else{
System.out.println ("電壓過(guò)高不可以充電");
}
}
}
需要得到的類,手機(jī)充電需要5v電源
//適配接口
public interface Voltage5V {
int output();
}
適配器,將220V轉(zhuǎn)為5V
類適配器
//類適配器
public class VoltageAdapterClass extends Voltages220v implements Voltage5V{
//適配過(guò)程即將220轉(zhuǎn)為5v
public int output() {
//獲取到220電壓
int src = output220V ();
int dst = src / 44;
return dst;
}
}
對(duì)象適配器
//對(duì)象適配器
public class VoltageAdapterObject implements Voltage5V {
//對(duì)象適配器將要適配的對(duì)象作為成員變量
Voltages220v output220V;
public VoltageAdapterObject(Voltages220v output220V) {
this.output220V = output220V;
}
//適配過(guò)程即將220轉(zhuǎn)為5v
public int output() {
//獲取到220電壓
int src = output220V.output220V ();
int dst = src / 44;
return dst;
}
}
調(diào)用
public class Client {
public static void main(String[] args) {
//類適配器
Phone phone = new Phone ();
phone.charging (new VoltageAdapterClass () );
//對(duì)象適配器
Phone phone1 = new Phone ();
Voltages220v voltages220v = new Voltages220v ();
phone1.charging ( new VoltageAdapterObject (voltages220v));
}
}
/**
* 一 類適配器
* 1.類適配器的注意事項(xiàng)
* 1)java是單繼承機(jī)制,所以類適配器需要繼承src(Voltages220v)類這一點(diǎn)算是一個(gè)缺點(diǎn),因?yàn)檫@要求dst必須是一個(gè)接口,有局限性
* 2)src類的方法在Adapter中會(huì)暴露出來(lái),也增加了使用成本 在VoltageAdapter中我們使用了Voltages220v的output220V的方法,output220V方法被暴露了
* 3)由于其繼承了src類,所以他可以根據(jù)需求重寫src類的方法,是的adapter更加的靈活
* 二 對(duì)象適配器
* 1.對(duì)象類適配器介紹
* 1) 基本思路和類的適配器模式相同,只是將Adapter類做修改,不是繼承src,而是持有src類的實(shí)例,解決java單繼承的問(wèn)題.
* 2) 根據(jù)"合成服用原則",在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系替代繼承關(guān)系
* 3)對(duì)象適配器是適配器模式常用的一種
*/
接口適配器
需要被適配的類
public class Voltages220v {
public int output220V() {
int src = 220;
System.out.println ("電壓" + src + "v");
return src;
}
}
需要得到的類,手機(jī)充電需要5v電源
public interface Interface {
//接口適配器,可以適配多個(gè)電壓的方法
void m5v();
void m12v();
void m24v();
void m110();
}
使用的接口定義了4個(gè)方法,我們只需要5v,所以定義了一個(gè)中間適配器
public abstract class AbsInterface implements Interface {
//創(chuàng)建了一個(gè)中間適配器,用于實(shí)現(xiàn)默認(rèn)的接口方法,減少使用時(shí)候適配器的代碼量
Voltages220v voltages220v;
public AbsInterface(Voltages220v voltages220v) {
this.voltages220v = voltages220v;
}
@Override
public void m5v() {
}
@Override
public void m12v() {
}
@Override
public void m24v() {
}
@Override
public void m110() {
}
}
public class Client {
public static void main(String[] args) {
Voltages220v voltages220v = new Voltages220v ();
//因?yàn)榻o手機(jī)充電,只需要5v就可以了
AbsInterface absInterface = new AbsInterface (voltages220v) {
@Override
public void m5v() {
System.out.println (voltages220v.output220V ());
System.out.println ("只重寫m5v方法");
}
};
absInterface.m5v ();
}
}
/**
* 三 接口適配器
* 1.接口適配器介紹
* 1) 一些書籍稱為: 適配器模式也叫缺省適配器模式
* 2) 當(dāng)不需要全部實(shí)現(xiàn)接口提供的方法時(shí),可先設(shè)計(jì)一個(gè)抽象類接口,為改接口中每個(gè)方法提供一個(gè)默認(rèn)實(shí)現(xiàn),那么改抽象類的子類可以有選擇的覆蓋父類的某些方法實(shí)現(xiàn)需求
* 3) 試用于一個(gè)接口不想使用所有方法的情況.
*/