天天看點

擴充卡模式(Adapter Pattern)

加個"擴充卡"以便于複用

1.使用情況

在程式世界中,經常存在現有的程式無法直接使用,需要适當的變化才能使用.這種用于填補倆個程式之間差異的設計模式就是擴充卡模式。

擴充卡模式分為以下倆種:

  • 類擴充卡模式(使用繼承的擴充卡)->類和接口
  • 對象擴充卡模式(使用委托的擴充卡)->倆個類

2.類擴充卡

擴充卡模式(Adapter Pattern)

程式類圖

擴充卡模式(Adapter Pattern)

Banner類

/**
 * @author Jay
 * @date 2019/5/23 22:52
 * @description
 */
public class Banner {
    private String string;

    public Banner(String string) {
        super();
        this.string = string;
    }

    /**
     * 括号方式
     */
    public void showWithParen() {
        System.out.println("(" + string + ")");

    }

    /**
     * 星号方式
     */
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}
           

Print接口

/**
 * @author Jay
 * @date 2019/5/23 22:54
 * @description 定義列印接口
 */
public interface Print {
    /**
     * 定義列印方式
     */
    void printWeak();

    /**
     * 不同的列印方式
     */
    void printStrong();
}
           

PrintBanner類:擴充卡,實作接口又繼承類,可以使用倆者的方法.

/**
 * @author Jay
 * @date 2019/5/23 22:55
 * @description 擴充卡,實作接口又繼承類,可以使用倆者的方法.
 */
public class PrintBanner extends Banner implements Print {
    /**
     * 擴充卡對象
     */
    public PrintBanner(String string) {
        super(string);
        // 父類隻有一個構造器則子類隻能調用父類唯一構造器
        // 需把值傳入
    }

    @Override
    public void printWeak() {
        //有個隐式的super可以調用父類方法
        super.showWithParen();
    }

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

Main

/**
 * @author Jay
 * @date 2019/5/23 23:01
 * @description
 */
public class Main {
    /**
     * 測試類
     */
    public static void main(String[] args) {
        //接口引用接收其實作類對象
        Print p = new PrintBanner("Hello");
        //隻能調用從接口實作的方法以及子類自己的方法,無法調用父類.
        p.printStrong();
        p.printWeak();
    }
}
           

Banner類中具體方法實作細節對Main完全隐藏,Main不知道PrintBanner中如何實作,這樣就可以在不對Main類修改的情況下改變PrintBanner的具體實作細節。

3.對象擴充卡(使用委托)

擴充卡模式(Adapter Pattern)

Banner類

/**
 * @author Jay
 * @date 2019/5/23 22:52
 * @description
 */
public class Banner {
    private String string;

    public Banner(String string) {
        super();
        this.string = string;
    }

    /**
     * 括号方式
     */
    public void showWithParen() {
        System.out.println("(" + string + ")");

    }

    /**
     * 星号方式
     */
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}
           

Print類

/**
 * @author Jay
 * @date 2019/5/23 23:13
 * @description
 */
public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
}
           

PrintBanner類

/**
 * @author Jay
 * @date 2019/5/23 23:13
 * @description
 */
public class PrintBanner extends Print {
    /**
     * 使用組合将倆個類方法都可以調用
     */
    private Banner banner;

    public PrintBanner(String string) {
        // 構造函數建立Banner對象
        this.banner = new Banner(string);
    }

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

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

Main

public class Main {
    //測試類
    public static void main(String[] args) {
        Print p = new PrintBanner("Hello");//接口引用接收其實作類對象
          //隻能調用從接口實作的方法以及子類自己的方法,無法調用父類.                                 
        p.printStrong();
       p.printWeak();   
    }
}
           

4.擴充卡的各種角色

Target(對象)

該角色負責定義所需的方法.示例中Print接口(被實作)和Print類(被委托)

ex:筆記本電腦工作所需12v電源

Clint(請求者)

該角色負責将Target所定義的方法具體實作.示例中的Main類.

ex:筆記本電腦

Adaptee(被适配)

持有既定方法的角色 ,Banner類

ex:220v電源

Adapter(擴充卡)

使用Adaptee角色的方法來滿足Target角色的需求.PrintBanner類

ex:電源擴充卡

擴充卡實作的倆種模式:

使用繼承:

擴充卡模式(Adapter Pattern)

使用委托:

擴充卡模式(Adapter Pattern)

可以将穩定代碼,封裝好的代碼重複利用,用擴充卡進行組裝,進而生成新的類,友善代碼的排查.

To GitHub

繼續閱讀