一、 基本概念

有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。

  其实本篇要说的这个设计模式就和这很有关系,由于当投资者自己买股票时,由于众多投资者对众多股票的联系太多,反而不利于操作,这在软件中就成为耦合性太高,而有了基金后,就变成众多用户只和基金打交道,关心基金的上涨和下跌,而实际上的操作确是基金经理人与股票和其它投资产品打交道,这就是外观模式。

  外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。UML结构图如下:

其中Facade是外观角色,也叫门面角色,客户端可以调用这个角色的方法,此角色知晓子系统的所有功能和责任,将客户端的请求代理给适当的子系统对象;Subsystem是子系统角色,可以同时拥有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合,子系统并不知道门面的存在。

1、外观类

这里我给出了2个Subsystem子系统,分别为A、B。

package designMode.facade2;public class Facade {//被委托的对象SubSystemA a;SubSystemB b;public Facade() {a = new SubSystemA();b = new SubSystemB();}//提供给外部访问的方法public void methodA() {this.a.dosomethingA();}public void methodB() {this.b.dosomethingB();}
}

2、subsystem子系统角色

这里为了不过多赘述,只放上A的代码,其余子系统类似。

package designMode.facade2;public class SubSystemA {public void dosomethingA() {System.out.println("子系统方法A");}
}
package designMode.facade2;public class SubSystemB {public void dosomethingB() {System.out.println("子系统方法B");}
}

3、client客户端

package designMode.facade2;public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.methodA();facade.methodB();}
}

4、运行结果:

二、外观模式的应用

1、应用场景

(1)客户端不需要知道内部的复杂联系,整个系统只提供一个“接待员”即可

(2)定义系统的入口

2、方法

客户端不与系统耦合,外观类与系统耦合

3、优点

(1)减少了系统的相互依赖

(2)提高了灵活性,不管系统内部如何变化,只要不影响到外观对象,任你自由活动

(3)提高了安全性,想让你访问什么你就只能访问什么

4、缺点

修改麻烦

5、使用场景

(1)为一个复杂的模块或子系统提供一个外界访问的接口

(2)子系统相对独立,外界对子系统的访问只要黑箱操作即可

(3)预防低水平人员带来的风险扩散

6、应用实例

基金(用户只和基金打交道,实际操作为基金经理人与股票和其它投资品打交道)

三、外观模式的实现

我们就以开篇说的基金为例,来编写一下代码,熟悉外观模式的使用。UML图如下:

1、基金类(Fund)

基金类,基金经理人通过该类作为中间交互者,可以接受投资者的资金,统一对股票、国债、房地产进行购买和赎回操作。

package designMode.facade2;public class Fund {Stock1 stock1;Stock2 stock2;Stock3 stock3;public Fund() {stock1 = new Stock1();stock2 = new Stock2();stock3 = new Stock3();}//购买基金public void buyFund() {stock1.buy();stock2.buy();stock3.buy();}//赎回基金public void sellFund() {stock1.sell();stock2.sell();stock3.sell();}
}

2、股票、国债、房地产类

这里放一个股票作为示例,其余债券类似。内部由买入和卖出两种操作。

public class Stock1 {//买股票public void buy() {System.out.println("股票1买入");}//卖股票public void sell() {System.out.println("股票1卖出");}
}

3、client客户端

用户通过该类对基金进行购买和赎回操作。

package designMode.facade2;public class Client {public static void main(String[] args) {Fund fund = new Fund();//基金购买fund.buyFund();System.out.println("-------------");//基金赎回fund.sellFund();}
}

4、运行结果:

由此可见,外观模式十分简单,我们只需要在客户端购买和赎回即可,内部的任何操作都不需要我们关注,对于面向对象有一定基础的朋友,即使没有听说过外观模式,也完全有可能在很多时候使用它,因为它完美的体现了依赖倒转原则和迪米特法则的思想,是非常常用的模式之一。

我们使用外观模式的情况有很多,比如经典的MVC三层架构,可以考虑在数据访问层和业务员逻辑层、业务逻辑层和表示层的层与层之间简化外观Facade,降低耦合度。对于复杂难以维护的老系统,直接去修改或扩展都可能产生很多原因,可以分两个小组,一个开发facade与老系统的交互,另一个只需要了解facade接口,直接开发新系统调用这些接口即可。

素小暖讲设计模式

浅谈Facade外观模式相关推荐

  1. 设计模式笔记 10.Facade 外观模式(结构型模式)

    10. Facade 外观模式      2008-8-18 动机(Motivation) 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种 ...

  2. 设计模式10: Facade 外观模式(结构型模式)

    Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...

  3. 设计模式学习之---Facade(外观)模式

    1.Facade外观模式,是一种接口型模式.这种模式的目的在于,它为子系统中的一组接口,定义了一个更高层次的接口,通过这个接口,提供一个统一的接口,使子系统更加容易使用. 2.实现:创建一个新的类,提 ...

  4. Facade外观模式

    Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.在这里我想举一个例子: ...

  5. 浅谈示波器X-Y模式 示波器触发模式及使用

    描述 示波器是一种用途十分广泛的电子测量仪器.它能把肉眼看不见的电信号变换成看得见的图像,便于人们研究各种电现象的变化过程.接下来我们就来了解一下示波器的X-Y模式以及示波器触发模式,同时了解一下两种 ...

  6. 建造者模式浅谈 与工厂模式的区别

    感谢您的阅读.如果感觉文章对您有用,麻烦您动动手指点个赞,以资鼓励.谢谢! 转载请注明出处哈 建造者模式浅谈 与工厂模式的区别_茄子_土豆的博客-CSDN博客_建造者模式和工厂模式的区别 创建对象时构 ...

  7. 趣谈设计模式 | 外观模式(Facade):为子系统提供高粒度接口

    文章目录 案例:自动驾驶飞机 外观模式 总结 完整代码与文档 案例:自动驾驶飞机 随着自动驾驶汽车的大卖,特X拉开始把目标转向飞行领域,打算开发出一款能够完全自动行驶的飞机,系统初步的设计如下 我们将 ...

  8. php5.1 facade,php设计模式 Facade(外观模式)

    模式定义:外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加 ...

  9. 设计模式之Facade(外观)模式

    我们通过一个简单的开关电脑模拟程序来说明Facade模式(外观模式) CPU类 public class Cpu {  public void start()  {   system.out.prin ...

最新文章

  1. Python自动化办公系列之Python操作PDF
  2. Shell多线程操作及线程数控制实例
  3. tomcat高并发配置
  4. linux安装mysql 5.6_linux 安装mysql5.6
  5. 解决ssh无密码登录不成功的问题
  6. 开源java项目_请问有哪些开源java项目值得学习的?学习完了容易找工作的?
  7. [20190226]测试使用bbed恢复索引.txt
  8. NHibernate的缓存管理机制
  9. java统计汉字个数_java统计汉字字数的方法示例
  10. SpringJDK动态代理实现
  11. java bi报表工具_7款顶级开源BI(商务智能)软件和报表工具
  12. vrp问题的java_VRP(车辆路径问题)的两种简单算法
  13. docker network详解、教程
  14. 2020-05-05
  15. ZZULIOJ:1156: 单数变复数
  16. python编辑器——wingIDE的使用详解
  17. 雨林木风 Ghost XP SP3 纯净版 Y1.0
  18. 基于麒麟SP10服务器版的Kubernetes集群安装
  19. tkinter布局详解
  20. 手机导航软件上的那些算法

热门文章

  1. 安川西格玛7驱动器手册_安川SGD7W-7R6A20A安装指南手册伺服驱动器手册 - 广州凌控...
  2. 梦想与行动:仰望星空,脚踏实地
  3. 论文研读-多因子进化算法中的自适应知识迁移MFEA-AKT
  4. 33. 搜索旋转排序数组
  5. BN、LN、IN、GN的区别
  6. GitStats - 统计Git所有提交记录工具
  7. 记一次 Centos7 yum 安装、配置 PgAdmin4
  8. 服务器重装2012,Windows Server 2012安装初体验
  9. 阿里巴巴《Java开发手册》2019最新版下载!
  10. 优词词根词典mdx_成都seo网店优化24小时在线,关键词优化步骤