智者千慮必有一失,愚者千慮必有一得html
在咱們開發過程當中也會常常碰到一些給原有的系統加一些功能,因此無論前期咱們呢可行性、需求分析和系統設計處理的多好,隨着時間的推移,總會出一些「意外」。所以咱們該如何處理掉這些「意外」呢?聰明的程序員們就想到了許多的補救模式,其中適配器模式就是補救模式中的一種。這種模式能夠可以讓你從由於業務的快速迭代而引起代碼改變的煩惱中解脫出來。程序員
將一個類的接口變換成客戶端所期待的另外一種接口,從而使本來由於接口不匹配而沒法在一塊兒工做的兩個類可以一塊兒工做設計模式
適配器模式有三個角色ide
適配器模式有兩種體現形式,一種是經過繼承來表現,一種是經過關聯對象來表現,下面給演示下繼承表現的適配器。設計
下面咱們寫一個簡單的適配器模式的例子,以下所示code
Target
接口代碼htm
interface Target{ public void request(); }
實現了Target
接口的類對象
class RealTarget implements Target{ @Override public void request() { System.out.println("I am Target"); } }
Source
源目標類blog
class Source{ public void doSomething(){ System.out.println("I am Source"); } }
接下來核心的角色要出現了就是Adapter
類繼承
class Adapter extends Source implements Target{ @Override public void request() { super.doSomething(); } }
接下來咱們能夠進行調用試試
public class AdapterTest { public static void main(String[] args) { Target target = new RealTarget(); target.request(); Target target2 = new Adapter(); target2.request(); } }
打印以下
I am Target I am Source
咱們上面使用的是經過繼承來使用適配器模式,還有一種作法就是將原有的繼承關係變動爲關聯關係就能夠了。
對象適配器和類適配器的區別在於:類適配器是經過繼承來表現的,而對象適配器是對象的合成關係,也能夠說是類的關聯關係,這是二者的根本區別。兩個都會在項目中用到,因爲對象適配器是經過類間的關聯關係進行耦合的,所以在設計的時候就比較靈活。而類適配器只能經過覆寫源角色的方法進行擴展。所以在實際項目中,對象適配器的使用場景比較多。
咱們仍是先來看一下對象適配器的類圖以下
而後寫一個通用的例子
如今接口Target
interface Target2{ public void printSource1(); public void printSource2(); }
而後有Adapter
class Adapter implements Target{ private Source1 source1; private Source2 source2; public Adapter(){ source1 = new Source1(); source2 = new Source2(); } @Override public void printSource1() { source1.print(); } @Override public void printSource2() { source2.print(); } }
而後兩個Source
class Source1{ public void print(){ System.out.println("I am Source1"); } } class Source2{ public void print(){ System.out.println("I am Source2"); } }
而後進行調用以下
public static void main(String[] args) { Target2 target2 = new Adapter2(); target2.printSource1(); target2.printSource2(); }
打印以下
I am Source1 I am Source2
這樣在之後增長了需求之後,只須要從新寫適配器便可,上層代碼不用動。
適配器應用的場景只須要記住一點就夠了:當你有動機修改一個已經投產中的接口時,適配器模式是最適合你的模式。好比系統擴展了,須要使用一個已有或者是新建的類,可是這個類又不符合系統的接口,怎麼辦?這時候就可使用適配器模式。