舉個慄子 問題描述 股民炒股票 簡單實現 股票1 其他股票 測試 測試結果 外觀模式 定義 為了子系統中的一組介面提供一個一致的界面,此模式定義了一個高層的介面,這個介面使得這個子系統更加容易使用。 UML圖 代碼實現 基金類(Facade) 測試 測試結果同上,此處省略。 總結 首先,在設計初期階 ...
舉個慄子
問題描述
股民炒股票
簡單實現
股票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();
}
}
測試結果同上,此處省略。
總結
- 首先,在設計初期階段,應該要有意識的將不同的兩個層分離,層與層之間建立外觀 Facade;
- 其次,在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜,增加外觀 Facade 可以提供一個簡單的介面,減少它們之間的依賴;
- 第三,在維護一個遺留的大型系統時,可能這個系統已經非常難以維護和擴展了,為新系統開發一個外觀 Facade 類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰簡單的介面,讓新系統與 Facade 對象交互,Facade 與遺留代碼交互所有複雜的工作。