1、定義
(Facade)爲子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口是的這一子系統更加容易使用。
2、使用場景
散戶投資情況,爲了降低風險而購買了基金,專業的基金經理人會去購買一些股票,國債、房地產等。
3、代碼結構UML圖
客戶:客戶端類,調用。
基金:Facade外觀類,知道哪些子系統負責處理請求,將客戶的請求代理給適當的子系統對象。
股票一、二、三,國債一,房地產一:
SubSystem Classes子系統類集合,實現子系統的功能,處理Facade對象指派的任務,注意之類中沒有Facade的任何信息,即沒有對Facade對象的引用。
4、類的實現
(1)、Fund(基金類)
public class Fund {
Stock1 gu1;
Stock2 gu2;
Stock3 gu3;
NationalDebt1 nd1;
Realty1 rt1;
public Fund() {
gu1 = new Stock1();
gu2 = new Stock2();
gu3 = new Stock3();
nd1 = new NationalDebt1();
rt1 = new Realty1();
}
public void bugFund() {
gu1.buy();
gu2.buy();
gu3.buy();
nd1.buy();
rt1.buy();
}
public void sellFund() {
gu1.sell();
gu2.sell();
gu3.sell();
nd1.sell();
rt1.sell();
}
}
(2)、Stock1 、Stock2、Stock3、NationalDebt1、Realty1(股票類、國債類、房地產類)
public class Stock1 {
public void sell() {
System.out.println("股票1賣出");
}
public void buy() {
System.out.println("股票1買入");
}
}
public class Stock2 {
public void sell() {
System.out.println("股票2賣出");
}
public void buy() {
System.out.println("股票2買入");
}
}
public class Stock3 {
public void sell() {
System.out.println("股票3賣出");
}
public void buy() {
System.out.println("股票3買入");
}
}
public class NationalDebt1 {
public void sell() {
System.out.println("國債1賣出");
}
public void buy() {
System.out.println("國債1買入");
}
}
public class Realty1 {
public void sell() {
System.out.println("房地產1賣出");
}
public void buy() {
System.out.println("房地產1買入");
}
}
5、客戶端調用
public static void main(String[] args) {
Fund jijin = new Fund();
//基金購買
jijin.bugFund();
//基金贖回
jijin.sellFund();
}
輸出:
6、總結
設計初期階段,應該要有意識的將不同的兩個層分離,比如景點的三層架構就需要考慮在數據訪問層和業務邏輯層、業務邏輯層和表示層的層與層之間建立外觀Facade。
在開發階段,子系統往往因爲不斷的重構演化二變得越來越複雜。
增加外觀Facade可以提供一個簡單的接口,減少它們之間的依賴。
在維護一個遺留的大型系統時,可能這個系統以及非常難以維護和擴展了。
爲新系統開發一個外觀Facade類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰簡單的接口,讓新系統與Facade對象交互,Facade與遺留代碼交互所有複雜的工作。
參考:《大話設計模式》