外观模式应用场景举例:
一次和MM在QQ上聊天,MM说自己表哥在炒股挣了很多钱,到表哥那里总是听表哥和客人说什么期货、股票、国债等专业术语,听的都一头雾水,而且据 说还有一个神奇的基金,你只需要把资金交给相关的机构,这些机构就可以直接帮你用钱挣钱,你自己根本不用关心具体的过程!MM就在QQ中问GG这具体是什 么意思,当MM在QQ中描述这些信息的时候,GG就在一边看信息一边在网上查这些名词的相关解释,于是就直接拷贝到QQ中发了过去,如下:
基金:花钱雇人帮你炒股,亏赚都是你的,人家收手续费和资金保管费。
期货:就是花钱买一些你拿不到实际货物的东西。可以买空卖空,缴纳保证金可以使资金放大交易,风险和收益也随之放大。
股票:买了某个公司的股票你就是这个公司的股东,如果感觉股票涨了你赚钱之后可以随时卖掉。亏了的感觉只有你自己知道了
国债:就是国家找你借钱,然后给你利息,但是必须在规定的期限到期之后才给你兑现。
外观模式解释:
外观模式(Fa?ade Pattern)是比较常用的一种软件设计模式,属于结构型模式的一种。它为一组具有类似功能的类群,比如类库,子系统等等提供一个统一的高层接口。这个 高层接口以一种简单一致的界面展现给使用者,从而使得子系统、类群等更容易使用。
英文定义为:Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
外观模式的UML图:
建造者模式涉及以下的角色:
外观(Facade)角色: 为调用方定义简单的调用接口。
客户端(Clients)角色:通过Facade接口调用提供某功能的内部类群,读写子系统各个接口的数据资源。
类群(Packages)角色:功能提供者。指提供功能的类群(模块或子系统)。
外观模式深入分析:
在真实的应用系统中,一个子系统可能由很多类组成。子系统的客户端为了它们的需要,需要和子系统中的一些类进行交互。客户端和子系统的类进行直接的交互会 导致客户端对象和子系统之间高度耦合。任何的类似于对子系统中类的接口的修改,会对依赖于它的所有的客户类造成影响。外观模式(Facade pattern)为子系统提供了一个更高层次、更简单的接口,从而降低了子系统的复杂度和依赖。这使得子系统更易于使用和管理。
外观是一个能为子系统和客户端提供简单接口的类。当正确的应用外观,客户不再直接和子系统中的类交互,而是与外观交互。外观承担与子系统中类交互的责任。 实际上,外观是子系统与客户的接口,这样外观模式降低了子系统和客户的耦合度。这样,就可以使得当子系统改变的时候,客户端可以保持不变性。
尽管客户端使用由外观提供的简单接口,但是当需要的时候,客户端还是可以视外观不存在,直接访问子系统中的低层次的接口。这种情况下,它们之间的依赖/耦合度和原来一样。
外观模式使用场景分析及代码实现:
在上面的使用场景中,期货、股票、国债分别属于单一的不同的投资类型,而基金可以把这些类型综合起来,也就是说,基金相当于期货、股票、国债的外观,大众只需要通过基金这个接口进行理财投资即可。
UML模型图如下所示:
建立股票类:
package com.diermeng.designPattern.Facade.impl; /* * 股票类 */ public class Stock { /* * 购买股票 */ public void buy() { System.out.println("购买股票"); } }
|
建立国债类:
package com.diermeng.designPattern.Facade.impl; /* * 国债类 */ public class NationalDebt { /* * 购买国债 */ public void buy() { System.out.println("购买国债"); } } |
建立期货类:
package com.diermeng.designPattern.Facade.impl; /* * 期货类 */ public class Futures {
public void buy() { System.out.println("购买期货"); } }
|
建立基金类:
package com.diermeng.designPattern.Facade.impl;
/* * 基金类 */ public class Fund { //声明股票 private Stock stock; //声明国债 private NationalDebt guozai; //声明期货 private Futures futures;
//构造方法 实例化声明的变量 public Fund() { this.guozai = new NationalDebt(); this.stock = new Stock(); this.futures = new Futures(); }
//A种基金类型 public void fundA() { this.guozai.buy(); this.futures.buy(); } //B种基金类型 public void fundB() { this.guozai.buy(); this.stock.buy(); } //C种基金类型 public void fundC() { this.futures.buy(); this.stock.buy(); }
//D中基金类型 public void fundD() { this.guozai.buy(); this.stock.buy(); this.futures.buy(); } } |
最后我们建立测试客户端:
package com.diermeng.designPattern.Facade.client;
import com.diermeng.designPattern.Facade.impl.Fund;
/* * 测试客户端 */ public class FacadeTest { public static void main(String[] args) { //建立基金类 Fund jijin = new Fund();
//调用相应的方法 System.out.println("***************************"); jijin.fundA(); System.out.println("***************************"); jijin.fundB(); System.out.println("***************************"); jijin.fundC(); System.out.println("***************************"); jijin.fundD(); System.out.println("***************************"); } } |
输出的结果如下:
*************************** 购买国债 购买期货 *************************** 购买国债 购买股票 *************************** 购买期货 购买股票 *************************** 购买国债 购买股票 购买期货 ***************************
|
外观模式的优缺点分析:
优点:
外观模式通过提供一个统一的对外接口,一方面可以避免外部系统和子系统之间的直接联系,从而降低系统间的依赖程度;另外一方面,如何外部系统想和子系统进行直接的交互,也可以绕过外观模式,这使得外部系统对子系统的使用非常的灵活。
缺点:
外观模式对外部系统提供的接口是有限的,从这个角度上讲,是限制了外部系统对子系统调用的灵活性。
外观模式的实际应用简介:
一般而言,外观模式使用于以下场合:
第一:为一个复杂的子系统提供一个简单的接口。子系统往往因为不断的演化而变的越来越复杂,使用外观模式可以保持外部系统对子系统调用的简洁性,而那些需要细节调用的用户却可以越过外观模式直接对子系统进行调用。
第二:引进外观模式可以将一个子系统和使用它的客户端以及其它的子系统分离开来,这就提高了子系统的独立性和可移植性。
第三:在构建一个层次化结构的时候,可以使用外观模式定义每一个层次对外交互的接口。此时,层与层之间只需要通过外观进行通信,从而简化层与层之间的依赖关系。
外观模式是一种得到广泛应用的模式,例如我们熟知的MVC模式就采用了外观模式。在MVC,在MVC架构模式中,每一层并不需要知道其它层次的细节,只是通过层与层之间的接口调用即可。这大大的方便了开发。
温馨提示:
一般而言,外观模式是在复杂系统中拥有多个子系统的情况系为子系统提供方便一致的对外接口,但是这并不妨碍外部系统和子系统的直接交互,因为外部系统可以穿越外观而直接与子系统交互。
对于股票、期货、基金而言,基金就相当于它们的外观,而且还可以组合出多个不同的外观来攻股民选购。