简说设计模式——外观模式

伊丽莎白-简 等级 391 0 0

一、什么是外观模式

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

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

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

简说设计模式——外观模式

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

  1. 外观类

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

 1 public class Facade { 2 
 3     //被委托的对象
 4     SubSystemA a;
 5     SubSystemB b;
 6     SubSystemC c;
 7     SubSystemD d;
 8     
 9     public Facade() { 10         a = new SubSystemA(); 11         b = new SubSystemB(); 12         c = new SubSystemC(); 13         d = new SubSystemD(); 14 } 15     
16     //提供给外部访问的方法
17     public void methodA() { 18         this.a.dosomethingA(); 19 } 20     
21     public void methodB() { 22         this.b.dosomethingB(); 23 } 24     
25     public void methodC() { 26         this.c.dosomethingC(); 27 } 28     
29     public void methodD() { 30         this.d.dosomethingD(); 31 } 32     
33 }

  2. Subsystem子系统角色

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

1 public class SubSystemA { 2 
3     public void dosomethingA() { 4         System.out.println("子系统方法A"); 5 } 6     
7 }

  3. Client客户端

 1 public class Client { 2 
 3     public static void main(String\[\] args) { 4         Facade facade = new Facade(); 5         
 6         facade.methodA();
 7         facade.methodB();
 8     }
 9     
10 }

  运行结果如下:

  简说设计模式——外观模式

二、外观模式的应用

  1. 何时使用

  • 客户端不需要知道系统内部的复杂联系,整个系统只提供一个“接待员”即可
  • 定义系统的入口

  2. 方法

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

  3. 优点

  • 减少了系统的相互依赖
  • 提高了灵活性。不管系统内部如何变化,只要不影响到外观对象,任你自由活动
  • 提高了安全性。想让你访问子系统的哪些业务就开通哪些逻辑,不在外观上开通的方法,你就访问不到

  4. 缺点

  • 不符合开不原则,修改很麻烦

  5. 使用场景

  • 为一个复杂的模块或子系统提供一个外界访问的接口
  • 子系统相对独立,外界对子系统的访问只要黑箱操作即可
  • 预防低水平人员带来的风险扩散

  6. 应用实例

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

    三、外观模式的实现


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

简说设计模式——外观模式

  1. 基金类(Fund)

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

 1 public class Fund { 2 
 3     Stock1 stock1;
 4     Stock2 stock2;
 5     Stock3 stock3;
 6     NationalDebt1 nationalDebt1;
 7     Realty1 realty1;
 8     
 9     public Fund() { 10         stock1 = new Stock1(); 11         stock2 = new Stock2(); 12         stock3 = new Stock3(); 13         nationalDebt1 = new NationalDebt1(); 14         realty1 = new Realty1(); 15 } 16     
17     //购买基金
18     public void buyFund() { 19 stock1.buy(); 20 stock2.buy(); 21 stock3.buy(); 22 nationalDebt1.buy(); 23 realty1.buy(); 24 } 25     
26     //赎回基金
27     public void sellFund() { 28 stock1.sell(); 29 stock2.sell(); 30 stock3.sell(); 31 nationalDebt1.sell(); 32 realty1.sell(); 33 } 34     
35 }

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

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

 1 public class Stock1 { 2 
 3     //买股票
 4     public void buy() { 5         System.out.println("股票1买入");
 6     }
 7     
 8     //卖股票
 9     public void sell() { 10         System.out.println("股票1卖出"); 11 } 12     
13 }

  3. Client客户端

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

 1 public class Client { 2 
 3     public static void main(String\[\] args) { 4         Fund fund = new Fund(); 5         
 6         //基金购买
 7         fund.buyFund();
 8         System.out.println("-------------");
 9         //基金赎回
10 fund.sellFund(); 11 } 12     
13 }

  运行结果如下:

  简说设计模式——外观模式

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

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

  源码地址:https://gitee.com/adamjiangwh/GoF

本文转自 https://www.cnblogs.com/adamjwh/p/9048594.html,如有侵权,请联系删除。

收藏
评论区

相关推荐

<Dart基础>Dart简介
Dart基础系列: Dart简介(https://www.jianshu.com/p/c749f40828a5) Dart语法(上)(https://www.jianshu.com/p/6b5689342e24) <基础Dart语法(下)(https://www.jianshu.com/p/7c3eba46e679) 一、简
Dart基础&gt;Dart语法(上)
Dart基础系列: Dart简介(https://www.jianshu.com/p/c749f40828a5) Dart语法(上)(https://www.jianshu.com/p/6b5689342e24) <基础Dart语法(下)(https://www.jianshu.com/p/7c3eba46e679) 说明:
Dart基础语法简介
Dart基础系列: Dart简介(https://www.jianshu.com/p/c749f40828a5) Dart语法(上)(https://www.jianshu.com/p/6b5689342e24) <基础Dart语法(下)(https://www.jianshu.com/p/7c3eba46e679) 一、简
通过一个简单实例了解vuex
简单说明 什么是vuex,vuex怎么使用,什么场景下适合使用vuex, vuex 文档(https://links.jianshu.com/go?tohttps%3A%2F%2Fvuex.vuejs.org%2Fzh%2F)中都有介绍。看完文档之后,都知道vuex的核心有State、Getter、Mutation、Action、Modul
Node.js爬虫实战 - 爬你喜欢的
前言 今天没有什么前言,就是想分享些关于爬虫的技术,任性。来吧,各位客官,里边请... 开篇第一问:爬虫是什么嘞? 首先咱们说哈,爬虫不是“虫子”,姑凉们不要害怕。 爬虫 一种通过一定方式按照一定规则抓取数据的操作或方法。 开篇第二问:爬虫能做什么嘞? 来来来,谈谈需求 产品MM: 1. 爱豆的新电影上架了,整体电影评价如何呢? 2. 暗
简说设计模式——外观模式
一、什么是外观模式   有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机
简说设计模式——观察者模式
一、什么是观察者模式   观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。   对于观察者模式而言,肯定有观察
一文搞懂什么是HTTP与HTTPS
(https://blog.csdn.net/petterp/article/details/102779257)Http与Https的区别。 在最近的开发中,深感网络相关基础知识薄弱,于是趁周末好好总结一
20 张图彻底弄懂 HTTPS 的原理
前言 近年来各大公司对信息安全传输越来越重视,也逐步把网站升级到 HTTPS 了,那么大家知道 HTTPS 的原理是怎样的吗,到底是它是如何确保信息安全传输的?网上挺多介绍 HTTPS,但我发现总是或多或少有些点有些遗漏,没有讲全,今天试图由浅入深地把 HTTPS 讲明白,相信大家看完一定能掌握 HTTPS 的原理,本文大纲如下: HTTP 为什么不安全
给公司面试了100多个前端,心态差点给爷整崩了
公司最近在做扩招,从去年到现在给公司面试前端,到现在大概面了100200个,给我整哭了 简历简历不带,问点基础题,一问三不知, 问个水平垂直居中布局,支支吾吾半天说不出来, 还有个弟弟说你这样问我不知道怎么回答,累了。 我只想说,这真的有三年的经验嘛? (https://imghelloworld.osscnbeijing.aliyu
说说设计模式
设计模式 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总
多人说Python简单,但是如何入门Python并精通?
一般而言,Python几个月就可以开始使用了。假如你几个月没入门,那肯定是方法不对,或者是偷懒.我在公众号里有一篇文章详细写了“初学者别上爬虫”,爬虫虽然很有趣,但不适合于小白用户。以下是2点:多人说Python简单,但是如何入门Python并精通?Python再简单再通俗,它也是一门语言,掌握一门语言绝非一朝一夕,我个人不推荐初学者上岸学习爬虫,我举一个很
https://cloud.tencent.com/developer/article/write/1830331
一、目标今天的目标是这个sign和appcode 二、步骤 Jadx没法上了app加了某梆的企业版,Jadx表示无能为力了。 FRIDADEXDumpDexDump出来,木有找到有效的信息。 Wallbreaker葫芦娃的Wallbreaker可以做些带壳分析,不过这个样本,用Frida的Spawn模式可以载入,Attach模式会失败。而直接用Objecti
手把手教你用Python网络爬虫实现起点小说下载
今天要跟大家分享一个小说爬取案例起点小说的小说下载。在做这个案例之前,我们需要对其进行分析,1.界面分析,如图:通过分析很容易就找到了我们的get请求参数,然后获取相应页面的小说名和链接:获取到数据之后,我们就随机挑选一篇小说来进行下载,我们选第一篇,然后打开它的文章目录,可以看到是这样的,如图:基本上这篇小说很长,可以看到它卷一和卷二是免费的,后面的收费,
手把手教你用Python制作简易小说阅读器
/前言/ 不知从什么时候开始。小说开始掀起了一股浪潮,它让我们平日里的生活不在枯燥乏味,很多我们做不到的事情在小说里都能轻易实现。 今天我们要做的就是一个小说阅读器了,一个可以将你的文章中的字每隔多少秒显示一次的阅读器,就好比手机上的定时阅读一样,是不是很有趣?那么下面我们就来具体看看它是如何实现的吧。 /具体实现/小说阅读器的话,当然界面是少不了的,下面

热门文章

Go 框架解析 -iris_一个北漂的程序猿Go Iris学习笔记01

最新文章

Go Iris学习笔记01Go 框架解析 -iris_一个北漂的程序猿