一、什么是外观模式
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
外观模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
UML图如下所示:
其中,Facade为外观角色,也叫门面角色,客户端可以调用这个角色,这个角色知晓子系统(SubsystemClasses1、SubsystemClasses2…)的所有功能,将客户端的请求代理给某个子系统,子系统去实现功能。
比如去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
- Facade:接待人员
- SubsystemClasses1:挂号
- SubsystemClasses2:门诊
- SubsystemClasses3:划价
这时候我们只需要去找到某个接待人员,让其带领我们去挂号、门诊、划价等流程,整个流程就会及其方便,这也是外观模式最大的好处。
二、为什么要用外观模式
如果现在的你有十万元放在余额宝,你感觉余额宝的利息太少,想要获取更大的利润,就上网查询 手中有十万存款,怎样能最大利益化?
这时候,可能有一个东西映入你眼帘:股票
当然,我们基本都是 股票 小白,我们也不懂财务知识、不会分析公司的未来发展,但是我就是想参加怎么办?
这时候有一个叫做基金的东西
基金就是别人替你买股票,所以人的能力是关键,你必须找到一个人或者团队,他们有能力给你选择好的股票进行投资。
所以,我们将自己的钱交给某个基金,让其代替我们去买一些比较好的股票。
我们可以发现,如果我们自己去挑选股票的话,每种股票可能要费大量的时间
如果我们去购买基金,我们可以挑选一个可靠的基金,通过这个基金来购买一些股票,这时候我们不需要关心这些股票,只需要找到这个基金。
类似我们的外观模式,我们只需要找到基金这个外观角色,让基金去执行股票、债券、外汇这些子系统,最终成为人生赢家。
我们来比较一下两种方式的区别:
- 外观模式
- 普通模式
三、外观模式的实现
整体结构图如下图所示:
Fund:
public class Fund { Stock1 stock1; Stock2 stock2; Stock3 stock3; NationalDebt1 nationalDebt1; Realty1 realty1; public Fund() { stock1 = new Stock1(); stock2 = new Stock2(); stock3 = new Stock3(); nationalDebt1 = new NationalDebt1(); realty1 = new Realty1(); } public void buyFund() { stock1.buy(); stock2.buy(); stock3.buy(); nationalDebt1.buy(); realty1.buy(); } public void sellFund() { stock1.sell(); stock2.sell(); stock3.sell(); nationalDebt1.sell(); realty1.sell(); } }
Stock1:
public class Stock1 { public void buy() { System.out.println("股票1买入"); } public void sell() { System.out.println("股票1售出"); } }
TestMain:
public class TestMain { public static void main(String[] args) throws InterruptedException { Fund fund = new Fund(); // 购买基金 fund.buyFund(); // 等待一段时间 System.out.println("等待中......"); Thread.sleep(200); // 售出基金 fund.sellFund(); //股票1买入 //股票2买入 //股票3买入 //债券1买入 //房地产1买入 //等待中...... //股票1售出 //股票2售出 //股票3售出 //债券1售出 //房地产1售出 } }
四、总结
我们可以看到,通过直接调用 fund 的 buyFund()
和 sellFund()
可以实现股票、债券、房地产的统一购买和售卖
我们只需要通过 Fund 这个接待员,就可以获取更大的利润
外观模式总体来说,不算复杂,多应用在对方只需要一个接口,不需要知晓你内部的运行逻辑
比如我们在和其他业务方进行沟通时,他们可能需要调用你的一个接口,这个时候,我们将这个接口暴露给他们,但其中内部逻辑封装在我们这,防止业务的泄漏。