概念
外观模式对外隐藏了系统的复杂性,向客户端提供了统一的访问接口,使得系统更易于被使用。
- 门面(Facade Class):客户端调用门面类方法。门面类了解一个或多个子系统的功能和责任,将请求委派到相应的子系统去。
- 子系统(SubSystem Classes):每个子系统都不是一个单独的类,可以是一个类、一个功能模块或者一个完整的系统。子系统并不知道门面的存在,对于子系统而言,门面仅仅是一个客户端而已。
例子
通过买基金的例子实现门面模式。我们知道,直接购买股票风险大,很多人会选择购买基金,其实在基金业务的背后,也是对股票买卖进行了整合,而这些操作这些对客户来说都是透明的。
Stock:股票买入卖出
public class Stock1 { public void buy(){ System.out.println("stock1买入"); } public void sell(){ System.out.println("stock1卖出"); } }
public class Stock2 { public void buy(){ System.out.println("stock2买入"); } public void sell(){ System.out.println("stock2卖出"); } }
public class Stock3 { public void buy(){ System.out.println("stock3买入"); } public void sell(){ System.out.println("stock3卖出"); } }
Fund(基金):
public class Fund { private Stock1 stock1 = new Stock1(); private Stock2 stock2 = new Stock2(); private Stock3 stock3 = new Stock3(); public void buy(){ stock1.buy(); stock2.buy(); stock3.buy(); } public void sell(){ stock1.sell(); stock3.sell(); } }
Client(客户端):
public class Client { public static void main(String[] args) { Fund fund = new Fund(); fund.buy(); fund.sell(); } }
优点:
- 降低了对子系统的耦合
- 隐藏子系统细节,提升了安全性
缺点:
不符合开闭原则,对修改关闭,对扩展开放。