不學無數——適配器模式

適配器模式

智者千慮必有一失,愚者千慮必有一得html

在咱們開發過程當中也會常常碰到一些給原有的系統加一些功能,因此無論前期咱們呢可行性、需求分析和系統設計處理的多好,隨着時間的推移,總會出一些「意外」。所以咱們該如何處理掉這些「意外」呢?聰明的程序員們就想到了許多的補救模式,其中適配器模式就是補救模式中的一種。這種模式能夠可以讓你從由於業務的快速迭代而引起代碼改變的煩惱中解脫出來。程序員

適配模式的定義

將一個類的接口變換成客戶端所期待的另外一種接口,從而使本來由於接口不匹配而沒法在一塊兒工做的兩個類可以一塊兒工做設計模式

適配器模式有三個角色ide

  • Source:須要被適配的接口或者對象,你想把誰轉換成目標角色,那麼這個「誰」就是Source角色
  • Target:須要獲得的接口或者對象,即適配完Source獲得的接口或者對象,咱們所指望的接口
  • Adapter:適配器,協調Source和Target使兩個可以一塊兒工做。經過繼承或者是類關聯的方式

繼承適配器

適配器模式有兩種體現形式,一種是經過繼承來表現,一種是經過關聯對象來表現,下面給演示下繼承表現的適配器。設計

適配器模式類圖

下面咱們寫一個簡單的適配器模式的例子,以下所示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

這樣在之後增長了需求之後,只須要從新寫適配器便可,上層代碼不用動。

適配器的優勢

  • 適配器模式可讓兩個沒有任何關係的類在一塊兒運行,只要適配器這個角色便可。
  • 增長了類的透明性:咱們訪問的是Target目標角色,可是具體的實現都是委託給了源角色,而這些對高層次的模塊是透明的,也是它不須要關心的。
  • 提升了類的複用:源角色在原有的系統中仍是可以繼續使用,而在目標角色中也能夠充當新的角色。
  • 靈活性好:若是某一天忽然一個適配器不須要了,那麼只要刪除便可,基本上就相似於一個靈活的構件,想用就用。

適配器模式的使用場景

適配器應用的場景只須要記住一點就夠了:當你有動機修改一個已經投產中的接口時,適配器模式是最適合你的模式。好比系統擴展了,須要使用一個已有或者是新建的類,可是這個類又不符合系統的接口,怎麼辦?這時候就可使用適配器模式。

參考文章

相關文章
相關標籤/搜索