Adapter 模式:
-
將兩個不相關的類組合在一起使用,需要用到Adapter模式。一個是Adaptee,一個是Adapter。
-
實際上,兩個不相關的類想要組合在一起使用, 可以修改類的接口, 但是,如果我們不想修改接口,或者根本沒有源代碼,就需要使用Adapter模式。
-
有一個接口用於提供需求,一個類用於實現需求,但是需要用一個類將兩者聯繫起來進行轉換,這個轉換的類就是Adapter(適配器)
實例:
- Print 接口有兩個方法,一個是輸出*號修飾的字符串,一個輸出<>包括的字符串。
- Banner 類是一個擁有兩個可以實現Print接口功能的方法,而我們不想修改Print接口來配合Banner的工作,所以這個時候需要使用PrintBanner類來把兩者聯繫起來。
Print 接口:
public interface Print {
public void printWithStar();
public void printWithPointBracket();
}
Banner 類:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Banner {
private String bannerName;
private final Logger LOGGER = LoggerFactory.getLogger(Banner.class);
public Banner(String bannerName) {
this.bannerName = bannerName;
}
public void showWithStar() {
LOGGER.info("{}","***"+ bannerName +"***");
}
public void showWithPointBracket() {
LOGGER.info("{}","<<<" + bannerName + ">>>");
}
}
PrintBanner 類:
public class PrintBanner extends Banner implements Print{
public PrintBanner(String bannerName) {
super(bannerName);
}
@Override
public void printWithStar() {
showWithStar();
}
@Override
public void printWithPointBracket() {
showWithPointBracket();
}
}
測試用例以及結果:
public void AdapterPatternTest() {
PrintBanner printBanner = new PrintBanner("Adapter");
printBanner.showWithStar();
printBanner.showWithPointBracket();
}
16:42:12.730 [main] INFO com.zyy.admin.pojo.Banner - ***Adapter***
16:42:12.732 [main] INFO com.zyy.admin.pojo.Banner - <<<Adapter>>>
什麼時候使用Adapter模式:
- 當有一些類被測試過多冊,Bug很少,這個時候我們開發一些新的接口時,可以選擇複用這些類,這個時候就需要Adapter模式來把兩者聯繫起來。
- 版本升級時,我們把舊的代碼作爲Adaptee,用Adapter作爲新版本。
- 假如有一個接口需要實現一些方法,現在有一個類滿足它的要求,而且已經測試完畢,Bug很少,這個時候我們有兩者選擇,一個是直接修改類的實現方法來滿足接口的實現,另一個則是使用Adapter來承接兩者。我們需要考慮到如果這個類與它關聯的不只是這一個接口時,直接修改是不是會增大測試的成本,其他依賴這個類的模塊會不會受影響,這樣耦合度是不是太高了。所以,這個時候使用Adapter模式,我們既複用了已經測試好的類,更不會影響到與這個類關聯的其他模塊。
- 如果接口的實現和類的功能完全不同,那麼我們也就完全沒有必要使用Adapter模式。