JDK IO中的適配器模式和裝飾者模式

適配器模式

類圖以下:java

  • Target表示目標接口, 也就是客戶端承認的標準接口, 只有符合target接口規範的類(實現了target接口),才能爲Client工做。
  • Adaptee表示須要適配的類, 這個類的特徵是沒實現target接口, 不符合標準, 可是它卻提供了一些特殊功能, 還想被Client所用, 那麼就須要一個適配器來讓Client可以調用 這個被適配器標準化的特殊功能類
  • Adapter 適配器類, 適配器能夠分爲多種適配器
    • 類適配器
    • 對象適配器(委託方式)
      這裏寫圖片描述
      上圖爲類適配器
      這裏寫圖片描述
      上圖爲對象適配器

1、類適配器

// 已存在的、具備特殊功能、但不符合咱們既有的標準接口的類
class Adaptee {
    public void specificRequest() {
        System.out.println("被適配類具備 特殊功能...");
    }
}
// 目標接口,或稱爲標準接口
interface Target {
    public void request();
}

// 具體目標類,只提供普通功能
class ConcreteTarget implements Target {
    public void request() {
        System.out.println("普通類 具備 普通功能...");
    }
}
// 適配器類,繼承了被適配類,同時實現標準接口
class Adapter extends Adaptee implements Target{
    public void request() {
        super.specificRequest();
    }
}
// 測試類
public class Client {
    public static void main(String[] args) {
        // 使用普通功能類
        Target concreteTarget = new ConcreteTarget();
        concreteTarget.request();

        // 使用特殊功能類,即適配類
        Target adapter = new Adapter();
        adapter.request();
    }
}

2、對象適配器

// 適配器類,直接關聯被適配類,同時實現標準接口
class Adapter implements Target{
    // 直接關聯被適配類
    private Adaptee adaptee;

    // 能夠經過構造函數傳入具體須要適配的被適配類對象
    public Adapter (Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        // 這裏是使用委託的方式完成特殊功能
        this.adaptee.specificRequest();
    }
}
// 測試類
public class Client {
    public static void main(String[] args) {
        // 使用普通功能類
        Target concreteTarget = new ConcreteTarget();
        concreteTarget.request();

        // 使用特殊功能類,即適配類,
        // 須要先建立一個被適配類的對象做爲參數
        Target adapter = new Adapter(new Adaptee());
        adapter.request();
    }
}

3、JDK中InputStreamReader對象適配器體現

這裏寫圖片描述

裝飾者模式

裝飾者模式就是動態的將責任附加到對象上, 若要擴展功能, 裝飾者提供了比繼承更優彈性的解決方案。
先來看一些怎麼用代碼來描述裝飾者。
類圖:
這裏寫圖片描述
假設我要買一杯飲料, 我能夠選擇加各類調料, 每種調料都有不同的價錢, 我能夠加多種調料。每次加調料我均可以動態的計算價格。
飲料抽象類:web

public abstract class Beverage {
    String description = "Unkown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

裝飾者抽象類:ide

public abstract class CondimentDecorator extends Beverage {

    public abstract String getDescription();
}

具體飲料Espresso:svg

public class Espresso extends Beverage {

    public Espresso() {
        description = "Espresso";
    }
    @Override
    public double cost() {
        return 0.3;
    }
}

我要加Mocha調料:函數

public class Mocha extends CondimentDecorator {

    Beverage beverage;

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

    @Override
    public double cost() {
        return 0.2 + beverage.cost();
    }
}

計算價格:測試

public class MainTest {
    public static void main(String[] args) {
        //我先定一杯飲料
        Beverage espresso = new Espresso();

        //我要加一些調料 用mocha調料去裝飾espresso飲料
        Mocha mocha = new Mocha(espresso);

        //計算總價錢
        System.out.println(mocha.getDescription());
        System.out.println(mocha.cost());
    }
}

在JDK IO中

這裏寫圖片描述

這裏寫圖片描述

相關文章
相關標籤/搜索