外观模式(Facade):为子系统中的一组接口提供一个一直的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式结构图:
案例需求:新股民对股票不熟悉,买基金,基金的专业人士拿新股民的钱去购买股票。
1:创建三个股票类和一个国债类。
package FacadeModel; /** * 股票1 * @author 我不是张英俊 * */ public class Stock1 { //卖股票 public void sell(){ System.out.println("股票1卖出"); } //买股票 public void buy(){ System.out.println("股票1买入"); } } package FacadeModel; public class Stock2 { //卖股票 public void sell(){ System.out.println("股票2卖出"); } //买股票 public void buy(){ System.out.println("股票2买入"); } } package FacadeModel; public class Stock3 { //卖股票 public void sell(){ System.out.println("股票3卖出"); } //买股票 public void buy(){ System.out.println("股票3买入"); } } package FacadeModel; /** * 国债 * @author 我不是张英俊 * */ public class NationalDebt1 { //卖国债 public void sell(){ System.out.println("国债卖出"); } //买国债 public void buy(){ System.out.println("国债买入"); } }
2:创建基金类。
package FacadeModel; /** * 基金类 * @author 我不是张英俊 * */ public class Fund { Stock1 st1; Stock2 st2; Stock3 st3; NationalDebt1 nd; public Fund(){ st1=new Stock1(); st2=new Stock2(); st3=new Stock3(); nd=new NationalDebt1(); } public void buyFund(){ st1.buy(); st2.buy(); st3.buy(); nd.buy(); } public void sellFund(){ st1.sell(); st2.sell(); st3.sell(); nd.sell(); } }
3:测试类
package FacadeModel; /** * 购买股票,但是因为不熟悉股票,所以购买基金, 通过专业人士操纵基金购买股票, * * 外观模式 * @author 我不是张英俊 * */ public class Test { public static void main(String[] args) { Fund jijin=new Fund(); //基金购买 jijin.buyFund(); //基金销售 jijin.sellFund(); } }
4:控制台。
股票1买入
股票2买入
股票3买入
国债买入
股票1卖出
股票2卖出
股票3卖出
国债卖出
但是外观模式在什么时候使用那?
首先,在设计系统的初期,应该有意识的将不同的两个层次分离。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时都会产生很多小类,这本是好事,但是也个外部调用他们的用户程序带来了使用上的困难,增加外观Facade 可以提供一个简单的接口,减少他们之间的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但是因为它包含了非常重要的功能,新的需求开发必须要依赖他,此时用外观模式 Facade也是非常合适的。你可以为新的系统开发一个外观Facade类,来提供设计粗糙或者高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。如下图: