在本博客之前的設計模式中,已經把創建型模式的講完了。這篇文章,我們來開始接觸結構型模式,結構型模式有7種之多,不過博主我會陪你一個一個來探討,逐個擊破。
首先適配器模式的作用在於串聯不同類的方法和功能。起到一個轉換,和匹配的作用。就好像我們常見的港版iPhone手機的充電器需要的轉接頭一樣。
適配器模式分爲三種模式,類的適配器模式、對象的適配器模式、接口的適配器模式。這3種模式實現的方式各有不同,我們先來看看類的適配器模式吧。上代碼:
/**
* 插座類
* 方法就是可以給使用的設備充電
*/
public class Plug {
public void charging(){
System.out.println("充電");
}
}
我們先創建一個插座類,類裏面加上充電的方法。
/**
* 表示充電過程的接口
*
*/
public interface IPlugAction {
/**
* 充電動作
*/
public void charging();
/**
* 充電條件
* 把充電器插到插座上
*/
public void putChargerToPlug();
}
然後這是一個充電過程的接口。包含了之前插座類的充電的方法。
/**
* 繼承了Plug類和實現了IPlugAction接口的充電類
*/
public class GetCharge extends Plug implements IPlugAction {
@Override
public void putChargerToPlug() {
System.out.println("把充電器插到插座上");
}
}
public class ChargeTest {
public static void main(String[] args) {
GetCharge getCharge = new GetCharge();
getCharge.charging();
getCharge.putChargerToPlug();
}
}
接着,我們創建這個類的適配器中最重要的類,GetCharge。這個類繼承了Plug類和實現了充電過程的接口。最後,我們就可以發現GetCharge類通過繼承類的方式來省去了其中一個方法的重寫,達到了自己的充電過程。這種方式就叫做類的適配器模式。在後面的輸出中,我們就可以看到完整的充電過程。
"C:\Program Files\Java\jdk1.8.0_60\bin\java"...
把充電器插到插座上
充電
Process finished with exit code 0
那對象的適配器模式是和類的適配器模式差不多嗎?答案是Yes!類的適配器是通過繼承類的方式,而對象的適配器則是通過實例化一個對象來達到目的。所以我們只修改了GetCharge類,就完成了對象的適配器模式了。我們看看修改過後的GetCharge類吧
/**
* 繼承了Plug類和實現了IPlugAction接口的充電類
*/
public class GetCharge implements IPlugAction {
private Plug plug;
public GetCharge(Plug plug) {
this.plug = plug;
}
@Override
public void putChargerToPlug() {
System.out.println("把充電器插到插座上");
}
@Override
public void charging() {
plug.charging();
}
}
其實這也是一種變通的方法來實現充電過程了。沒什麼好深究的了。那最後的接口的適配器模式又是怎麼樣的呢?
接口的適配器模式其實是使用了抽象類作爲承接的方式。我們都知道抽象類實現接口的時候可以不實例化。而我們之前的做法也是想着不實現接口裏面的所有方法。那就簡單了,我們先讓抽象類去實現這個充電過程的接口,然後我們再繼承這個抽象類,這樣我們再在繼承了抽象類的GetCharge類裏面實現一個充電的方法就好了。這種場景也經常發生在我們項目中,當你想要實現一個接口,但是又不想將這個接口中所有的方法都實現的情況。這時候,就可以使用接口的適配器模式,也就是弄一個抽象類來解決咯。
public abstract class AbstractCharge implements IPlugAction{
public void charging(){}
public void putChargerToPlug(){}
}
創建一個抽象類來實現IPlugAction接口。
public class Charge1 extends AbstractCharge {
public void charging(){
System.out.println("充電1");
}
}
public class Charge2 extends AbstractCharge {
public void putChargerToPlug(){
System.out.println("把充電器插到插座上");
}
}
再來2個類繼承抽象類。
public class ChargeTest {
public static void main(String[] args) {
Charge1 charge1 = new Charge1();
Charge2 charge2 = new Charge2();
System.out.println(1);
charge1.charging();
System.out.println(2);
charge1.putChargerToPlug();
System.out.println(3);
charge2.charging();
System.out.println(4);
charge2.putChargerToPlug();
}
}
1
充電1
2
3
4
把充電器插到插座上
在測試方法中,我們可以看到,繼承了抽象類的子類Charge1調用的charging方法是自己重寫後的。沒有重寫的方法調用的是抽象類的,自然就沒有打印結果了。這就是java的適配器模式了,不復雜。學習了以後,細心看看自己的項目吧,沒準也有用到的地方呢。
照舊分享一首歌的歌詞
Cause baby life is tired when you're on the road.
There's lots of pretty faces that I don't know.
I could hava a million people at my show .
I'd rather come home
--Home