本文共 1999 字,大约阅读时间需要 6 分钟。
外观模式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
转载地址:https://blog.csdn.net/Autumn03/article/details/80838783 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!