设计模式之门面设计模式
一、理清门面
门面模式很简单而且我们就在使用,废话不多说直接上类图。
关注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等等,他们不就是门面模式吗?哈哈学习了吗?不足之处欢迎指正。
设计模式之门面设计模式相关推荐
- 常用的设计模式(七)——门面设计模式
随着系统的不断改进和开发,它们会变得越来越复杂,系统会生成大量的类,这使得程序流程更难被理解.门面模式可为这些类提供一个简化的接口,从而简化访问这些类的复杂性. 门面模式(Facade)也被称为正面模 ...
- 抽丝剥茧——调停者和门面设计模式
调停者和门面设计模式 今天我们来聊两个设计模式:调停者设计模式和门面设计模式,为什么要将他们放在一起讲解,因为他们两个东东太像了,仅仅是由于作用的地方不同而产生的不同的叫法. 我们用一个对于我们90后 ...
- 20191219 门面设计模式
门面设计模式 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式. 使用哪种设计模式属于详细设计. 门面模式就是动里不动外,让外层好调用.使用门面设计模式. 门面设计 ...
- 简易的动物园管理系统之Java8流式API的重构代码(使用 门面设计模式)
文章目录 前言 之前的文章 本次的源码 AnimalTypeEnum SexEnum Animal AnimalFactory BaseAnimal Bird Cat Dog Fish AddAnim ...
- 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式
[网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...
- Java中的门面设计模式,非常有用!
门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只需要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来说,使用门 ...
- .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern
前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...
- 门面设计模式(Facade Pattern)
GOF设计模式 Facade Pattern 门面设计模式 门面模式例子:我有一个专业的Nikon相机,我就喜欢自己手动调光圈.快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会.幸好相机 ...
- python设计模式名片_Python设计模式之门面模式简单示例
本文实例讲述了python设计模式之门面模式.分享给大家供大家参考,具体如下: facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单 ...
最新文章
- mysql索引详细介绍简书_MySql索引详解
- 您也使用托管C++吗?
- mysql5_pn卸载_windows mySql(5.7.30) 卸载及重装
- 牛客网--牛牛找工作
- 计算机课组会议讲话,备课组长会议讲话稿
- BCGControlBar的使用方法
- 『高级篇』docker之开发用户服务EdgeService(13)
- matlab显示灰度值的概率,求Matlab统计灰度值的代码
- 新Linux木马发现:每30秒截图并用麦克风录音
- 如何让用户留在生态系统里?向苹果学习!【转载】
- SFB 项目经验-35-分配公网证书 For Exchange Server 2016(图解)
- android平台db4o使用示例
- android日记论文摘要,(毕业论文)基于android的日记本的设计与开发.doc
- 微信公众号推送模板消息(三):获取关注者列表 openid
- oracle表空间加密
- C# 正态分布图 标准偏差 STDEV 概率密度函数 NORM.DIST
- 【VSCode教程】 C++第一个DLL、远离手动GCC、快速自动生成、来 say_helloヽ(^o^)丿
- 欧几里得算法(求解最大公约数的优质方法)以及原理拓展
- Unity Timeline的使用
- 销售管理系统C语言课程设计