適配模式的定義如下:
將一個類的接口轉換成客戶端所期待的另一個接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一個工作
適配器模式在生活中還是很常見的,比如你的筆記本上的電源適配器,可以使用在110-220V之間變化的電源,而筆記本還能正常工作
適配器模式的通用類圖:
從類圖中可以得知適配模式主要設計到三個角色:
1.Target目標角色
該角色定義把其他類轉換爲何種接口,也就是我們期望的接口
2.Adaptee源角色
需要轉換成目標接口的角色,他已經存在、運行良好的類或者對象,經過適配器角色的包裝會成爲一個新的角色
3.Adapter適配器角色
適配器模式的核心角色,其他兩個角色都是已經存在的角色,而適配器角色是需要新建的,它的職責非常簡單就是把源角色轉換爲目標角色
適配模式通用代碼如下:
/** * 目標角色 * */ public interface Target { public void request(); }
/** *源角色 */ public class Adaptee { public void dosomething(){ System.out.println("do some thing"); } }
/** * 適配器角色 * */ public class Adapter extends Adaptee implements Target { /** * * @see com.huashao.chapter.chapter19.ch01.Target#request() */ @Override public void request() { super.dosomething(); } }
public class Client { public static void main(String[] args) { Target target=new Adapter(); target.request(); } }
從通用類圖以及代碼中可以看出適配有如下特點:
1.適配器模式可以讓兩個沒有任何關係的類在一起工作
2.增加了類的透明性
我們訪問的target目標角色,但是具體的實現都委託給了源角色,而這些對高層模塊是透明的,它們不需要關心
3.提高了類的複用性
源角色在原有系統中還是可以使用的,而在目標角色中可以充當新的成員
4.靈活性高
某一天,需求變了,不想使用這個適配器了,ok,刪掉這個適配器就行了,其他代碼不需要修改,就類似於可插拔
適配器模式的使用場景:
你有動機修改一個已經投產中的接口時,適配器模式就派上用場了
需求是多變的,可能需求並不是將一個類轉換爲目標角色,而是將多個類轉換爲目標角色,但是java規範中類只能單集成,那麼如何使用適配器模式呢?
既然不能集成,那就只能使用組合方式了,我們把這種適配器模式稱爲對象適配器模式,上一種模式稱爲類適配器模式
對象適配器模式類圖如下: