分享一篇以日本電飯煲為例,定義一個配接器類來支持這個電飯煲在中國使用的文章。
概念:配接器模式把一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起作業的兩個類能夠在一起作業。
應用場景
已經存在的類,它的方法和需求不匹配的情況。
配接器模式不是在設計階段考慮的設計模式,而是隨著軟體的維護出現不同情況下的解決方案。
主要用在不兼容的情況下,如SpringMVC使用配接器進行攔截請求和分發。
優點
更好的復用性,系統需要使用現有的類,而此類的介面不符合系統的需要。那么通過配接器模式就可以讓這些功能得到更好的復用。
更好的擴展性,在實作配接器功能的時候,可以呼叫自己開發的功能,從而自然地擴展系統的功能。
符合開閉原則
缺點
過多的使用配接器,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是A介面,其實內部被適配成了B介面的實作,一個系統如果太多出現這種情況,無異于一場災難。因此如果不是很有必要,可以不使用配接器,而是直接對系統進行重構。
技術要點
配接器模式可以砸符合OCP原則(開閉原則)的基礎上,為新類增加新的功能。該模式設計的角色主要有以下3個。
1.目標角色:就是期待得到的介面。
2.源角色:需要被增加功能的類或介面。
3.配接器角色:新創建的類,在源角色的基礎上實作了目標角色。
示例
代碼:
// 220V介面
public interface CN220VInterface {
public void connect();
}
public class CN220VInterfaceImpl implements CN220VInterface {
@Override
public void connect() {
System.out.println("中國220V,接通電源,開始作業");
}
}
//日本110V 電源介面
public interface JP110VInterface {
public void connect();
}
public class JP110VInterfaceImpl implements JP110VInterface {
@Override
public void connect() {
System.out.println("日本110V,接通電源,開始作業..");
}
}
//日本電飯煲
public class ElectricCooker {
private JP110VInterface jp110VInterface;//日本電飯煲
ElectricCooker(JP110VInterface jp110VInterface){
this.jp110VInterface=jp110VInterface;
}
public void cook(){
jp110VInterface.connect();
System.out.println("開始做飯了..");
}
}
public class PowerAdaptor implements JP110VInterface {
private CN220VInterface cn220VInterface;
public PowerAdaptor(CN220VInterface cn220VInterface) {
this.cn220VInterface = cn220VInterface;
}
@Override
public void connect() {
cn220VInterface.connect();
}
}
public class AdaptorTest {
public static void main(String[] args) {
CN220VInterface cn220VInterface = new CN220VInterfaceImpl();
//配接器介面
PowerAdaptor powerAdaptor = new PowerAdaptor();
// 電飯煲
ElectricCooker cooker = new ElectricCooker(powerAdaptor);
cooker.cook();//使用了配接器,在220V的環境可以作業了。
}
}
上述示例,是以日本電飯煲為例,日本的額定電壓為110V,而中國的額定電壓為220V。
那么如何在中國使用日本的電飯煲呢?
我們日常生活一般就是那一個變壓器,這樣就可以使用了。
那么代碼上如何實作的呢?
我們首先定義兩個電壓介面,一個110V一個220V分別代表日本額定電壓和中國的額定電壓,然后分別實作這兩個介面。接著再定義一個電飯煲類,作為我們的源角色,電飯煲有一個煮飯的功能,正常來說,這個日本電飯煲在中國是不能使用的,因為額定電壓的原因,這個時候我們就需要定義一個配接器類來支持這個電飯煲的使用,也就是PowerAdaptor這個類,幫我們適配一下,就可以在220V的環境下作業了,因為電飯煲必須接受110V的電壓才行,傳220V就會出問題,其實就是中間做了個轉換。
PowerAdaptor類我們也可以改成:
public class PowerAdaptor extends CN220VInterface implements JP110VInterface {
@Override
public void connect() {
super.connect();
}
}這種事通過繼承來實作,前一種是通過構造方法傳入來實作,兩種都可以。

文章來源公眾號,長按二維碼可關注,更有更多內推、面經、技術文章分享~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/97489.html
標籤:Java相關
