外觀模式Facade,爲子系統的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
例子:炒股
投資者可能面對多種股票
package Facade;
public class Stock1 {
public void sell(){
System.out.println("股票1賣出");
}
public void buy(){
System.out.println("股票1買入");
}
}
package Facade;
public class Stock2 {
public void sell(){
System.out.println("股票2賣出");
}
public void buy(){
System.out.println("股票2買入");
}
}
package Facade;
public class Stock3 {
public void sell(){
System.out.println("股票3賣出");
}
public void buy(){
System.out.println("股票3買入");
}
}
package Facade;
public class realty {
public void sell(){
System.out.println("房地產賣出");
}
public void buy(){
System.out.println("房地產買入");
}
}
package Facade;
public class nationalDebt {
public void sell(){
System.out.println("國債賣出");
}
public void buy(){
System.out.println("國債買入");
}
}
增加一個基金類,它需要了解所有的股票或其他投資方法的方法或者屬性,進行組合,以備外界調用。
package Facade;
public class Fund {
Stock1 gu1;
Stock2 gu2;
Stock3 gu3;
nationalDebt nd;
realty rt;
public Fund(){
gu1=new Stock1();
gu2=new Stock2();
gu3=new Stock3();
nd=new nationalDebt();
rt=new realty();
}
public void buyFund(){
gu1.buy();
gu2.buy();
gu3.buy();
nd.buy();
rt.buy();
}
public void sellFund(){
gu1.sell();
gu2.sell();
gu3.sell();
nd.sell();
rt.sell();
}
}
客戶端去調用,此時用戶不需要了解股票,甚至可以對股票一無所知,參與股票的具體買賣都由基金公司完成
package Facade;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Fund jijin=new Fund();
jijin.buyFund();
jijin.sellFund();
}
}
Facade方法實現中,一般是負責把客戶端的請求轉發給子系統內部的各個模塊進行處理,Facade的方法本身並不進行功能的處理,只是實現一個功能的組合調用。
優點:
1.鬆散耦合,外觀模式送傘了客戶端與子系統的耦合關係,讓子系統內部的模塊能更容易擴展和維護
2.簡單易用,外觀模式讓子系統更加易用,客戶端不再需要了解子系統內部的實現,也不需要跟衆多子系統內部的模塊進行交互,只需要跟外觀交互就可以了,相當於外觀類爲外部客戶端使用子系統提供了一站式服務
3.更好的劃分訪問層次,有些方法是對系統外的,有些方法是系統內部使用的,把需要保留給外部的功能集中到外觀中,這樣既方便客戶端使用,也很好的隱藏了內部的細節
針對上述優點,何時選用外觀模式?
1.希望爲一個複雜的子系統提供一個簡單接口,使用外觀對象實現大部分客戶需要的功能,從而簡化客戶的使用
2.想讓客戶程序和抽象類的實現部分鬆散耦合,使用外觀對象將這個子系統與它的客戶分離開,從而提高子系統的獨立性和可移植性
3.如果構建多層結構的系統,可以考慮使用外觀模式,使用外觀對象作爲每層的入口,既可以簡化層間調用,也可以鬆散層次之間的依賴關係
參考:
《大話設計模式》
https://my.oschina.net/xianggao/blog/615213