天天看點

設計模式之适應設計模式_Adapter模式_加一個擴充卡以便複用

前言

​​部落客github​​

​​部落客個人部落格http://blog.healerjean.com​​

1、Adapter模式有兩種

1、類擴充卡模式(使用繼承的擴充卡)

2、對象擴充卡 (使用委托的擴充卡)

1.2、擴充卡模式和裝飾器模式的差別

裝飾器與擴充卡都有一個别名叫做 包裝模式(Wrapper),它們看似都是起到包裝一個類或對象的作用,但是使用它們的目的很不一一樣。

擴充卡模式将一個接口轉變成另一個接口,它的目的是通過改變接口來達到重複使用的目的。當然也有适配之前的,并且建立跟多的方法。 因為新舊接口不一緻導緻出現了用戶端無法得到滿足的問題,但是,由于舊的接口是不能被完全重構掉的(比如不是我們代碼中,而是别的jar包的對象),因為我們還想使用實作了這個接口的一些服務。那麼為了使用以前實作舊接口的服務,我們就應該把新的接口轉換成舊接口;實作這個轉換的類就是抽象意義的轉換器

裝飾器模式不是要改變被裝飾對象的接口,而是恰恰要保持原有的接口,但是增強原有對象的功能,或者改變原有對象的處理方式而提升性能。是以這兩個模式設計的目的是不同的。

2、執行個體程式

現在實際情況是 我們的電壓是100V的,但是我們想要的是220V的電壓,現在我們希望底層還是用它,也就是說基于100V 的實作,但是我們以後都不會再用着100V了

1、實際情況

1.1.1、實際情況Banner

/**
 * 目前的實際情況
 */
public class Banner  {

    public String string;

    public Banner(String string) {
        this.string = string;
    }
    public void showWithParen() {
        System.out.println("(" + string + ")");
    }
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}      

1.1.2、測試Main

public class Main {
    public static void main(String[] args) {

        Banner  s = new Banner("\"Hello\"") ;
        s.showWithAster();
        s.showWithParen();
    }      

2、第一種:使用繼承的擴充卡

[外鍊圖檔轉存失敗(img-Y5DWBsbr-1566550452735)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1558686754766.png)]

1.2、​

​Print​

​ 接口

public interface  Print {

      void printWeak();

      void printStrong();
}      

1.3、​

​PrintBanner​

​ 擴充卡,繼承實作

擴充卡繼承上面的banner,這樣就具備了banner裡面的公共屬性

/**
 * 擴充卡角色
 */
public class AdapterPrintBanner extends Banner implements Print {


    public AdapterPrintBanner(String string) {
        super(string);
    }

    @Override
    public void printWeak() {
        showWithParen();
    }

    @Override
    public void printStrong() {
        showWithAster();
    }
}      

1.4、測試Main

public class Main {
    
    public static void main(String[] args) {


        Print p = new AdapterPrintBanner("Hello");

        p.printWeak();

        p.printStrong();

    }
}      

3、第二種:使用委托的擴充卡

3.1、​

​Print​

​ 抽象類

public interface  Print {

      void printWeak();

      void printStrong();
}      

3.2、AdapterPrintBanner 擴充卡委托實作

/**
 * 擴充卡,委托實作,聚合
 */
public class AdapterPrintBanner implements Print {

    private Banner banner;

    public AdapterPrintBanner(String string) {
        this.banner = new Banner(string);
    }

    @Override
    public void printWeak() {
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}      

3.2、測試Main

public class Main {

    public static void main(String[] args) {

        Print p = new AdapterPrintBanner("Hello");

        p.printWeak();

        p.printStrong();
    }
}      

4、現在的情況

我們使用的是Print接口來進行程式設計的,對于Mian而言,Banner類中的被隐藏起來了,這就比如是220V的工作了起來,但是實際上是100V的電壓轉化而成的。

5、UML

4…1、 類擴充卡模式(使用繼承)

設計模式之适應設計模式_Adapter模式_加一個擴充卡以便複用

4.2、對象擴充卡模式(使用委托)

[外鍊圖檔轉存失敗(img-LrxLbqlj-1566550452737)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1558689101738.png)]

5、Adapter登場角色

5.1、Target(對象)

該角色負責定義所需要的方法,示例程式中​

​Print​

​所扮演的角色

5.2、Client(請求者)

該角色負責使用​

​Target​

​​角色所定義的方法進行具體處理,示例程式中的​

​Main​

​扮演這個角色

5.3、Adapter (擴充卡 )

該角色是主人公,使用Adaptee角色的方法比對舊的需求,然後​

​實作​

​​或者​

​繼承​

​Print來滿足現狀的需求

5.4、Adaptee(被适配)

該角色是被适配的角色