大話設計模式筆記(九)の外觀模式

舉個栗子

問題描述

股民炒股票測試

簡單實現

股票1

/**
 * 股票1
 * Created by callmeDevil on 2019/7/20.
 */
public class Stock1 {

    public void sell() {
        System.out.println("股票1賣出");
    }

    public void buy() {
        System.out.println("股票1買入");
    }

}

其餘股票

/**
 * 股票2
 * Created by callmeDevil on 2019/7/20.
 */
public class Stock2 {
    // 代碼與股票1相似
}


/**
 * 股票3
 * Created by callmeDevil on 2019/7/20.
 */
public class Stock3 {
    // 代碼與股票1相似
}


/**
 * 國債1
 * Created by callmeDevil on 2019/7/20.
 */
public class NationalDebt1 {
    // 代碼與股票1相似
}


/**
 * 房地產1
 * Created by callmeDevil on 2019/7/20.
 */
public class Realty1 {
    // 代碼與股票1相似
}

測試

/**
 * 炒股測試
 * Created by callmeDevil on 2019/7/20.
 */
public class Test {

    public static void main(String[] args) {
        Stock1 stock1 = new Stock1();
        Stock2 stock2 = new Stock2();
        Stock3 stock3 = new Stock3();
        NationalDebt1 debt1 = new NationalDebt1();
        Realty1 realty1 = new Realty1();

        // 用戶須要瞭解股票、國債、房地產狀況,須要參與這些項目的具體買賣,耦合性很高
        stock1.buy();
        stock2.buy();
        stock3.buy();
        debt1.buy();
        realty1.buy();

        stock1.sell();
        stock2.sell();
        stock3.sell();
        debt1.sell();
        realty1.sell();
    }

}

測試結果

股票1買入
股票2買入
股票3買入
國債1買入
房地產1買入
股票1賣出
股票2賣出
股票3賣出
國債1賣出
房地產1賣出

外觀模式

定義

爲了子系統中的一組接口提供一個一致的界面,此模式定義了一個高層的接口,這個接口使得這個子系統更加容易使用。設計

UML圖

代碼實現

基金類(Facade)

/**
 * 基金類(Facade)
 * Created by callmeDevil on 2019/7/20.
 */
public class Fund {

    private Stock1 stock1;
    private Stock2 stock2;
    private Stock3 stock3;
    private NationalDebt1 debt1;
    private Realty1 realty1;

    public Fund(){
        stock1 = new Stock1();
        stock2 = new Stock2();
        stock3 = new Stock3();
        debt1 = new NationalDebt1();
        realty1 = new Realty1();
    }

    // 買基金
    public void buyFund(){
        stock1.buy();
        stock2.buy();
        stock3.buy();
        debt1.buy();
        realty1.buy();
    }

    // 賣基金
    public void sellFund(){
        stock1.sell();
        stock2.sell();
        stock3.sell();
        debt1.sell();
        realty1.sell();
    }

}

測試

/**
 * 基金測試(外觀模式)
 * Created by callmeDevil on 2019/7/20.
 */
public class Test {

    public static void main(String[] args) {
        // 此時用戶不須要了解股票,甚至能夠對股票一無所知,買了基金就回家睡覺
        // 一段時間後再贖回就能夠大把數錢,參與股票的具體買賣都有基金公司完成
        // 客戶端代碼很是簡潔明瞭
        Fund fund = new Fund();
        // 購買基金
        fund.buyFund();
        // 基金贖回
        fund.sellFund();
    }

}

測試結果同上,此處省略。3d

總結

  • 首先,在設計初期階段,應該要有意識的將不一樣的兩個層分離,層與層之間創建外觀 Facade;
  • 其次,在開發階段,子系統每每由於不斷的重構演化而變得愈來愈複雜,增長外觀 Facade 能夠提供一個簡單的接口,減小它們之間的依賴;
  • 第三,在維護一個遺留的大型系統時,可能這個系統已經很是難以維護和擴展了,爲新系統開發一個外觀 Facade 類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰簡單的接口,讓新系統與 Facade 對象交互,Facade 與遺留代碼交互全部複雜的工做
相關文章
相關標籤/搜索