結構型模式-外觀模式

分享影片鏈接:https://www.bilibili.com/video/BV1Q54y1R7FE/

 

以下是文字稿和幻燈片:

大家好,我今天給大家分享的是外觀模式:

模式動機:在軟體開發過程中,程式一般會越做越大,而這樣系統中類及子系統之間的影響會使彼此間的關係變得錯綜複雜即過多的耦合,這就導致了隨著系統中類或子系統發生變化,與之相關聯的子系統或類就需要發生變化。

 

引入外觀角色之後,用戶只需要直接與外觀角色交互,用戶與子系統之間的複雜關係由外觀角色來實現,從而降低了系統的耦合度。

外觀模式(Facade Pattern):外部與一個子系統的通訊必須通過一個統一的外觀對象進行,為子系統中的一組介面提供一個一致的介面,外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。外觀模式又稱為門面模式,它是一種對象結構型模式。

Provide a unified interface to a set of interfaces in a subsystem. Facade Pattern defines a higher-level interface that makes the subsystem easier to use.

 

 Facade表示外觀角色,客戶端可以調用這個角色的方法,此角色知道相關的子系統的功能和責任,正常情況下,將客戶端發來的請求交付給相應的子系統去完成。

子系統並不知道外觀類的存在,子系統僅僅把它當做另一個客戶端。

外觀模式包括如下角色:

  • Facade:知道哪些子系統的類能完成用戶請求的功能。可被客戶調用。將客戶的請求委派給適當的子系統對象來完成。
  • Subsystem:
    •   每個子系統都是多個類的集合。可被客戶或Facade調用。
    •   處理由Facade對象或客戶對象指派的任務。
    •   不知道Facade對象或客戶對象的存在。

有些人可能炒過股票,但其實大部分人都不太懂,這種沒有足夠了解證券知識的情況下做股票是很容易虧錢的,剛開始炒股肯定都會想,如果有個懂行的幫幫手就好,其實基金就是個好幫手,支付寶里就有許多的基金,它將投資者分散的資金集中起來,交由專業的經理人進行管理,投資於股票、債券、外匯等領域,而基金投資的收益歸持有者所有,管理機構收取一定比例的託管管理費用。

 

  1 public class Client {    2    3     public static void main(String[] args) {    4         Fund fund = new Fund();    5    6         //基金購買    7         fund.buyFund();    8         System.out.println("-------------");    9         //基金贖回   10         fund.sellFund();   11     }   12   13 }   14   15   16 public class Fund {   17   18     Stock1 stock1;   19     Stock2 stock2;   20     Stock3 stock3;   21     NationalDebt1 nationalDebt1;   22     Realty1 realty1;   23   24     public Fund() {   25         stock1 = new Stock1();   26         stock2 = new Stock2();   27         stock3 = new Stock3();   28         nationalDebt1 = new NationalDebt1();   29         realty1 = new Realty1();   30     }   31   32     //購買基金   33     public void buyFund() {   34         stock1.buy();   35         stock2.buy();   36         stock3.buy();   37         nationalDebt1.buy();   38         realty1.buy();   39     }   40   41     //贖回基金   42     public void sellFund() {   43         stock1.sell();   44         stock2.sell();   45         stock3.sell();   46         nationalDebt1.sell();   47         realty1.sell();   48     }   49   50 }   51   52 public class Stock1 {   53   54     //買股票   55     public void buy() {   56         System.out.println("股票1買入");   57     }   58   59     //賣股票   60     public void sell() {   61         System.out.println("股票1賣出");   62     }   63   64 }   65   66 public class Stock2 {   67   68     //買股票   69     public void buy() {   70         System.out.println("股票2買入");   71     }   72   73     //賣股票   74     public void sell() {   75         System.out.println("股票2賣出");   76     }   77   78 }   79   80 public class Stock3 {   81   82     //買股票   83     public void buy() {   84         System.out.println("股票3買入");   85     }   86   87     //賣股票   88     public void sell() {   89         System.out.println("股票3賣出");   90     }   91   92 }   93   94 public class NationalDebt1 {   95     //買國債   96     public void buy() {   97         System.out.println("國債1買入");   98     }   99  100     //賣國債  101     public void sell() {  102         System.out.println("國債1賣出");  103     }  104 }  105  106 public class Realty1 {  107     //買房地產  108     public void buy() {  109         System.out.println("房地產1買入");  110     }  111  112     //賣股票  113     public void sell() {  114         System.out.println("房地產1賣出");  115     }  116 }

 

  • 對客戶屏蔽子系統組件,減少了客戶處理的對象數目並使得子系統使用起來更加容易。通過引入外觀模式,客戶程式碼將變得很簡單,與之關聯的對象也很少。
  • 實現了子系統與客戶之間的松耦合關係,這使得子系統的組件變化不會影響到調用它的客戶類,只需要調整外觀類即可。
  • 降低了大型軟體系統中的編譯依賴性,並簡化了系統在不同平台之間的移植過程,因為編譯一個子系統一般不需要編譯所有其他的子系統。一個子系統的修改對其他子系統沒有任何影響,而且子系統內部變化也不會影響到外觀對象。
  • 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類。

  • 不能很好地限制客戶使用子系統類,如果對客戶訪問子系統類做太多的限制則減少了可變性和靈活性。
  • 在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源程式碼,違背了“開閉原則”。

  • 當要為訪問一系列複雜的子系統提供一個簡單入口時可以使用外觀模式。
  • 客戶端程式與多個子系統之間存在很大的依賴性。引入外觀類可以將子系統與客戶端解耦,從而提高子系統的獨立性和可移植性。
  • 在層次化結構中,可以使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯繫,而通過外觀類建立聯繫,降低層之間的耦合度。

謝謝大家