這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰設計模式
整體來講設計模式分爲三大類:建立型模式、結構型模式、行爲型模式。前面的系列文章都是爲建立型模式:markdown
<建造者模式>編碼
從今天起,咱們開始學習結構型模式。spa
結構型模式:主要用於描述如何組合類和對象以得到更大的結構。設計
適配器模式(Adapter Pattern)定義:將一個類的接口轉換成客戶但願的另一個接口,使得本來因爲接口不兼容而不能一塊兒工做的那些類能一塊兒工做code
適配器模式核心意義:兼容舊接口orm
適配器在咱們生活中隨處可見,好比電源適配器,不少電器並非直接使用220V電源,而須要一個電源適配器才能正常使用;還有咱們筆記本電腦的外接接口,若是隻有一個HDMI接口,想用在只能使用VGA接口上的設備上,咱們就須要一個額外轉接頭,這個轉接頭咱們就稱做適配器。
適配器模式原理咱們就能夠理解成適配器在生活中的做用。
適配器模式包含三個角色:
這三種角色用筆記本電腦外接接口例子來講,HDMI接口是咱們的目標接口,由於咱們電腦提供功能是HDMI接口視頻輸出;VGA設備就是適配者,咱們最終須要把視頻輸出在VGA設備上;轉接頭就是咱們的適配器
如今咱們有一個1.0版本商城場景,系統剛運行起來,咱們沒有自營商品,當前的商品都是第三方提供的,因此咱們商品下單時,要對接第三方下單服務:
// 第三方訂單服務
public class ThirdOrderService {
// 調用該方法,實現第三方接口下單
void thirdCreateOrder() {
System.out.println("第三方服務接口下單");
}
}
複製代碼
後面咱們商城系統發展起來了,對於商城的絕大部分商品,都變爲自營的了,後續商品的下單隻須要咱們調用本身的下單接口。
// 訂單服務接口
public interface OrderService {
/**
* 建立訂單接口
*/
void createOrder();
}
複製代碼
可是,商城還有少部分是第三方提供的的商品,而咱們新的建立訂單接口並不兼容舊第三方接口。這時候,咱們就可使用適配器模式,使新的訂單接口兼容舊的第三方接口
// 第三方訂單接口適配器
public class ThirdOrderServiceAdapter implements OrderService {
private ThirdOrderService thirdOrderService;
public ThirdOrderServiceAdapter() {
thirdOrderService = new ThirdOrderService();
}
@Override
public void createOrder() {
thirdOrderService.thirdCreateOrder();
}
}
複製代碼
客戶端使用狀況
public class Client {
public static void main(String[] args) {
OrderService orderService = new ThirdOrderServiceAdapter();
orderService.createOrder();
}
}
// 輸出結果:
第三方服務接口下單
複製代碼
從客戶端調用來看,咱們經過第三方訂單接口適配器,使新的建立訂單接口兼容了舊的第三方接口調用。
適配器模式通常有兩種不一樣的適配方法:對象適配和類適配。上面所演示的就是對象適配(經過組合方式)。接下來咱們看看類適配器,經過繼承方式實現。
public class ThirdOrderServiceAdapter2 extends ThirdOrderService implements OrderService {
@Override
public void createOrder() {
// 調用父類的第三方訂單建立接口
super.thirdCreateOrder();
}
}
複製代碼
一般,咱們喜歡使用組合多於繼承,因此更經常使用的是對象適配方式。類適配方式違背了咱們的組合/聚合複用原則