一、理清门面

门面模式很简单而且我们就在使用,废话不多说直接上类图。

关注Client类和Facad类还有subsystem即可。

OK,是不是觉得似曾相识,哈哈一会解答。先捋一捋门面的作用,从类图上来看我们外部的Client都需要通过访问Facad类才可以访问到subsystem。

很简单的模式,我不过多做解释了,先码代码。一看就明白了。

二、code

一股脑码在一起看完再解释,很简单。

/*** 商品系统* @author liyichen**/
public class GoodsSystem {public void showAllGoods() {System.out.println("展示所有的商品.....");}
}/*---------------------------------------分割线---------------------------*//*** 订单系统* @author liyichen**/
public class OrderSystem {public void createOrder() {System.out.println("订单被创建...");}
}

/*** 门面类* @author liyichen**/
public class Facade {private OrderSystem s1 = new OrderSystem();private GoodsSystem s2 = new GoodsSystem();public void createOrder() {s1.createOrder();}public void showAllGoods() {s2.showAllGoods();}
}
public class Client {public static void main(String[] args) {Facade f = new Facade();f.createOrder();}
}

OK,看明白了吗?我们整理一下:

1.客户端类只知道有门面的存在,对于客户端来说门面就是一个服务类,门面的角色对客户端类是无感知的 ;

2.对于真正的服务类来讲,门面类也是Client的存在,门面的角色同样对服务类无感知;

3.客户端类只能通过门面才能访问到服务类,门面只是委托的角色不参与任何业务逻辑。

三、思考与分析

我们来看一段代码,分析这个门面类设计的是否合理?

/*** 门面类* @author liyichen**/
public class Facade {private OrderSystem s1 = new OrderSystem();private GoodsSystem s2 = new GoodsSystem();public void createOrder() {s1.createOrder();}public void showAllGoods() {s2.showAllGoods();}public void shopping() {s2.showAllGoods();s1.createOrder();}
}

我们将门面类稍作修改,此时的shooping方法需要 s1和s2共同来完成。那这样的设计是否合理呢?

其实问题的答案我们在上面已经给出了,门面类不参与任何逻辑,只是委托服务。而现在的shooping方法已经在参与逻辑了,此时出现一个倒依赖的问题,客户端类必须通过门面才能完成业务逻辑。破坏系统的封装性,是一个错误的设计。

那正确的做法应该再提供出一个服务类,由它去操作逻辑,而门面只是作为委托的角色。

修改后如下:

public class Facade {private OrderSystem s1 = new OrderSystem();private GoodsSystem s2 = new GoodsSystem();private Shopping s3 = new Shopping();public void createOrder() {s1.createOrder();}public void showAllGoods() {s2.showAllGoods();}public void shopping() {s3.shopping();}
}

那我们再来想想门面给我们带来了什么好处?

1.安全性,大家都必须访问同一个入口才能得到结果。

2.减少依赖,客户端只需要知道门面即可。

同样的门面也有不足之处,他可能会特别臃肿,所以在适当情况吓可以根据模块再拆分不同的门面。

我们常用的网关啊,NGINX等等,他们不就是门面模式吗?哈哈学习了吗?不足之处欢迎指正。

设计模式之门面设计模式相关推荐

  1. 常用的设计模式(七)——门面设计模式

    随着系统的不断改进和开发,它们会变得越来越复杂,系统会生成大量的类,这使得程序流程更难被理解.门面模式可为这些类提供一个简化的接口,从而简化访问这些类的复杂性. 门面模式(Facade)也被称为正面模 ...

  2. 抽丝剥茧——调停者和门面设计模式

    调停者和门面设计模式 今天我们来聊两个设计模式:调停者设计模式和门面设计模式,为什么要将他们放在一起讲解,因为他们两个东东太像了,仅仅是由于作用的地方不同而产生的不同的叫法. 我们用一个对于我们90后 ...

  3. 20191219 门面设计模式

    门面设计模式 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式. 使用哪种设计模式属于详细设计. 门面模式就是动里不动外,让外层好调用.使用门面设计模式. 门面设计 ...

  4. 简易的动物园管理系统之Java8流式API的重构代码(使用 门面设计模式)

    文章目录 前言 之前的文章 本次的源码 AnimalTypeEnum SexEnum Animal AnimalFactory BaseAnimal Bird Cat Dog Fish AddAnim ...

  5. 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式

    [网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...

  6. Java中的门面设计模式,非常有用!

    门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只需要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来说,使用门 ...

  7. .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  8. 门面设计模式(Facade Pattern)

    GOF设计模式 Facade Pattern 门面设计模式 门面模式例子:我有一个专业的Nikon相机,我就喜欢自己手动调光圈.快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会.幸好相机 ...

  9. python设计模式名片_Python设计模式之门面模式简单示例

    本文实例讲述了python设计模式之门面模式.分享给大家供大家参考,具体如下: facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单 ...

最新文章

  1. mysql索引详细介绍简书_MySql索引详解
  2. 您也使用托管C++吗?
  3. mysql5_pn卸载_windows mySql(5.7.30) 卸载及重装
  4. 牛客网--牛牛找工作
  5. 计算机课组会议讲话,备课组长会议讲话稿
  6. BCGControlBar的使用方法
  7. 『高级篇』docker之开发用户服务EdgeService(13)
  8. matlab显示灰度值的概率,求Matlab统计灰度值的代码
  9. 新Linux木马发现:每30秒截图并用麦克风录音
  10. 如何让用户留在生态系统里?向苹果学习!【转载】
  11. SFB 项目经验-35-分配公网证书 For Exchange Server 2016(图解)
  12. android平台db4o使用示例
  13. android日记论文摘要,(毕业论文)基于android的日记本的设计与开发.doc
  14. 微信公众号推送模板消息(三):获取关注者列表 openid
  15. oracle表空间加密
  16. C# 正态分布图 标准偏差 STDEV 概率密度函数 NORM.DIST
  17. 【VSCode教程】 C++第一个DLL、远离手动GCC、快速自动生成、来 say_helloヽ(^o^)丿
  18. 欧几里得算法(求解最大公约数的优质方法)以及原理拓展
  19. Unity Timeline的使用
  20. 销售管理系统C语言课程设计

热门文章

  1. 关于第三方登录,你应该知道的
  2. Facebook Hacker Cup 2015 Round 1--Corporate Gifting(树形动态规划)
  3. Tumbler QML Type
  4. 新时期,老师该怎么撑伞?
  5. R语言实战-第九章 R in action-chapter9
  6. Python灰帽子笔记二
  7. 机器学习(二)-一元线性回归算法(代码实现及数学证明)
  8. 新宝市场分析大盘前瞻高位抱团股要提防
  9. excel countif_计算Excel数据COUNTIF COUNTA时出现问题
  10. Windows10安装ElasticSearch es