定義:為子系統中的一組接口提供一個一緻的界面,facaede模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
案例:
2 投資者買股片vs基金
投資者買股票,需要了解股票的各種資訊,預測它的未來,風險反而大
投資者買基金,基金經理人相對專業,不容易像散戶那麼盲目,基金經理人拿這些錢去做投資,然後大家獲利
由于在衆多投資者對衆多股票的聯系太多,反而不利于操作,耦合性過高。而有了基金以後,變成了衆多使用者隻和基金打交道,實際的操作卻是基金經理人在與上千隻股票和其他投資産品打交道。
class Stock1
{
public void Sell()
{
System.out.println("股票1賣出");
}
public void Buy()
{
System.out.println("股票1買入");
}
}
class Stock2
{
public void Sell()
{
System.out.println("股票2賣出");
}
public void Buy()
{
System.out.println("股票2買入");
}
}
class Stock3
{
public void Sell()
{
System.out.println("股票3賣出");
}
public void Buy()
{
System.out.println("股票3買入");
}
}
class NationalDebt1
{
public void Sell()
{
System.out.println("國債賣出");
}
public void Buy()
{
System.out.println("國債買入");
}
}
class Realty
{
public void Sell()
{
System.out.println("房地産賣出");
}
public void Buy()
{
System.out.println("房地産買入");
}
}
class Fund
{
Stock1 gu1;
Stock2 gu2;
Stock3 gu3;
NationalDebt1 nd1;
Realty rt1;
public Fund() {
gu1=new Stock1();
gu2=new Stock2();
gu3=new Stock3();
nd1=new NationalDebt1();
rt1=new Realty();
}
public void BuyFund()
{
gu1.Buy();
gu2.Buy();
gu3.Buy();
nd1.Buy();;
rt1.Buy();;
}
public void SellFund()
{
gu1.Sell();
gu2.Sell();
gu3.Sell();
nd1.Sell();
rt1.Sell();
}
}
public class main
{
public static void main(String[] args) {
Fund jijin=new Fund();
jijin.BuyFund();
jijin.SellFund();}
}
此時,使用者不需要了解股票,甚至可以對股票一無所知,買過基金過一段時間後再贖回就可以數錢了。參與股票的具體買賣都由基金公司完成。
基金類是系統中一組接口的封裝界面,也就是高層接口,通過調用高層接口,可以直接調用一組子接口而不需要了解子接口是如何實作的,具有高度保密性和代碼複用性。
class SubSystemOne
{
public void MethodOne()
{
System.out.println("子系統方法一");
}
}
class SubSystemTwo
{
public void MethodTwo()
{
System.out.println("子系統方法二");
}
}
class SubSystemThree
{
public void MethodThree()
{
System.out.println("子系統方法三");
}
}
class SubSystemFour
{
public void MethodFour()
{
System.out.println("子系統方法四");
}
}
class Facade//外觀類
{
SubSystemOne one;
SubSystemTwo Two;
SubSystemThree Three;
SubSystemFour Four;
public Facade()
{
one=new SubSystemOne();
Two=new SubSystemTwo();
Three=new SubSystemThree();
Four=new SubSystemFour();
}
public void MethodA()
{
System.out.println("\n方法組A()");
one.MethodOne();
Two.MethodTwo();
Four.MethodFour();
}
public void MethodB()
{
System.out.println("\n方法組B()");
Two.MethodTwo();
Three.MethodThree();
}
}
public class main
{
public static void main(String[] args) {
Facade facade=new Facade();
facade.MethodA();
facade.MethodB();
}
}
保安系統的例子
一個保安系統由兩個錄像機,三個電燈,一個遙感器和一個警報器組成
保安系統的操作人員需要經常将這些儀器啟動和關閉。
外觀模式使用的三個階段:
- 設計初期,應該有意識将不同的兩個層分離,這樣可以為複雜的子系統提供一個簡單的接口使得耦合度大大降低。
- 在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜,增加外觀Facaed可以提供一個簡單的接口,減少它們之間的依賴。
- 在維護一個遺留的大型系統時,可以使用外觀模式Facaed:為新系統開發一個外觀Facaed類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰的簡單接口,讓新系統與Facaed對象互動。希望包裝或隐藏原有系統
外觀模式的優點
- 屏蔽了外部用戶端和系統内部模闆的互動。
- Facaed的功能可以被多個用戶端調用,可以實作複用
- 對使用Facaed的人員來說,Facaed大大的節省了他們的學習成本。
本質:
封裝互動,簡化調用