设计模式之“外观模式(门面模式)(Facade)”
一.外观模式
1.概念
- 为子系统中的一组接口提供一个一致的界面
- 此模式定义了一个高层接口
- 这个接口使得这一子系统更加容易使用
- 他完美的体现了依赖倒转原则和迪米特法则的思想,是常用模式之一
2.何时使用
首先在设计初期阶段,应该要有意识的将不同的两个层分离(如:经典的三层架构)
- 经典的三层架构
就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与逻辑层之间建立外观模式(Facade)
- 这样可以为复杂的子系统提供一个简单的接口,使得耦合性大大降低
- 经典的三层架构
其次,在开发阶段,子系统往往因为不断的重构演化而变得原来越复杂
- 大多数的模式使用时也都会残生很多很小的类
- 会给外部调用他们的用户程序带来了使用上的困难
增加外观Facade类,可以提供一个简单的接口,减少他们之间的依赖
再则,维护一个遗留的大型系统时,可能这个系统已经非常难维护和扩展了
- 因为它包含非常重要的功能,新的需求开发必须要依赖于它。
- 此时用外观模式Facade也非常适合
你可以为新系统开发一个外观Facade类
来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口
让新系统与Facade对象交互,Facade与遗留代码交换所有复杂的工作
二.结构图

三.案例
1.测试类
package com.facadePatterns.facade; /**
* 测试外观模板
*
* @author 王子威
* @date 2022/9/15
*/
public class TestFacade
{
public static void main(String[] args)
{
// 生成外观类
Facade facade = new Facade();
// 外观模板A
facade.mathodA();
}
}
2.外观类
package com.facadePatterns.facade; /**
* 外观类【外观模板】
*
* @author 王子威
* @date 2022/9/15
*/
public class Facade
{
SubSystemOne subSystemOne;
SubSystemTwo subSystemTwo;
SubSystemThree subSystemThree;
SubSystemFour subSystemFour; /**
* 初始化各个子系统类
*/
public Facade()
{
this.subSystemOne = new SubSystemOne();
this.subSystemTwo = new SubSystemTwo();
this.subSystemThree = new SubSystemThree();
this.subSystemFour = new SubSystemFour();
} /**
* 外观模板A
*/
public void mathodA()
{
subSystemOne.methodOne();
subSystemTwo.methodTwo();
subSystemThree.methodThree();
subSystemFour.methodFour();
}
}
3.子系统一
package com.facadePatterns.facade; /**
* 子系统类一
*
* @author 王子威
* @date 2022/9/15
*/
public class SubSystemOne
{
public void methodOne()
{
System.out.println("子系统类一方法一");
}
}
4.子系统二
package com.facadePatterns.facade; /**
* 子系统类二
*
* @author 王子威
* @date 2022/9/15
*/
public class SubSystemTwo
{
public void methodTwo()
{
System.out.println("子系统类二方法二");
}
}
5.子系统三
package com.facadePatterns.facade; /**
* 子系统类三
*
* @author 王子威
* @date 2022/9/15
*/
public class SubSystemThree
{
public void methodThree()
{
System.out.println("子系统类三方法三");
}
}
6.子系统四
package com.facadePatterns.facade; /**
* 子系统类四
*
* @author 王子威
* @date 2022/9/15
*/
public class SubSystemFour
{
public void methodFour()
{
System.out.println("子系统类四方法四");
}
}
7.结果图

设计模式之“外观模式(门面模式)(Facade)”的更多相关文章
- 设计模式之——外观or门面模式
1.概念 定义一个高层的统一的外观接口类,该接口用于客户端调用,和一个实现类用来包装子系统中多个类,客户端可以通过客户端完成对子系统的方法调用. 2.适用场景 2.1 代码移植,降低了现有系统的复杂度 ...
- 外观模式 门面模式 Facade 结构型 设计模式(十三)
外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统 ...
- 设计模式在实际业务应用中的介绍之3——外观或门面模式Facade对AOP装配业务工厂的应用
在C#中实现的基于外观或门面模式打造的业务应用案例 以前一直没有想过写一些东西来把项目中用到的知识点及技术实现做一个归纳整理并分享出来.现在打算逐渐的把项目中的一些东西整理并分享出来,与大家共勉! 外 ...
- 设计模式 | 外观模式/门面模式(facade)
定义: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构:(书中图,侵删) 一个简洁易用的外观类 一个复杂的子系统 实例: 书中提到了理 ...
- java设计模式——外观模式(门面模式)
一. 定义与类型 定义:门面模式,提供一个统一的接口,用来访问子系统中的一群接口,门面模式定义了一个高层接口,让子系统更容易使用 类型:结构性 二. 使用场景 子系统越来越复杂,增加外观模式提供简单调 ...
- 开发设计模式(九)门面模式(Facade Pattern)
什么是门面模式? 门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用. 大家都写过纸质的信件吧,比如给女朋友写 ...
- JAVA设计模式——第 7 章 门面模式【Facade Pattern】(转)
好,我们继续讲课.大家都是高智商的人,都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,然后把信放到信封中,封好,投递到信箱中进行邮递,这个过程还是比较 ...
- IOS设计模式之二(门面模式,装饰器模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- java设计模式----外观模式(门面模式)
外观模式主要应用场景在于为复杂的子系统提供一个简单的接口,提高子系统的独立性. 创建DrawerOne类: package facade; public class DrawerOne { publi ...
- python设计模式---结构型之门面模式
门面,系统,客户端~ from django.test import TestCase class Hotelier: def __init__(self): print('Arranging the ...
随机推荐
- Java进阶 - [1-5] 泛型
一.什么是泛型 早期Java是使用Object来代表任意类型的,但是向下转型有强转的问题,这样程序并不安全. 针对List.Set.Map等集合类型,它们对存储的元素类型是没有任何限制的.例如 ...
- 借Processing语言及IDE做DOS批处理的事务( 批量修改文件夹或文件的名字 )
一直想用Processing语言做一些批处理的事务,因为其自带的IDE功能紧凑易用,极度轻量,又加上Java语言的生态极具友好,处理一些windows相关操作完全可行,简单快捷. 这次就是用它做[批量 ...
- 基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation Algorithms)
前言 协同过滤推荐系统,包括基于用户的.基于项目的息肉通过率等,今天我们读一篇基于项目的协同过滤算法的论文. 今天读的论文为一篇名叫<基于项目的协同过滤推荐算法>(Item-Based C ...
- 【Python脚本】刚度矩阵格式转换
对于1-2-3坐标系: 应力矩阵如下: \[\left.[\sigma]=\left[\begin{array}{ccc}\sigma_{11}&\sigma_{12}&\sigma_ ...
- 【Matlab】判断点和多面体位置关系的两种方法实现
分别是向量判别法(算法来自他人论文).体积判别法(code 是我从网上找的). 方法一: 向量判别法 方法来自一会议论文:<判断点与多面体空间位置关系的一个新算法_石露>2008年,知网. ...
- Selenium KPI接口 附件上传
实现功能 拖拽图片到百度上传图片搜索功能区域. 定位.send_keys(r'图片路径') 导入相关包 from selenium import webdriver from time import ...
- Redis会遇到的15个坑
前言 如果你在使用 Redis 时,也遇到过以下这些「诡异」的场景,那很大概率是踩到「坑」了. 究竟是什么原因,导致的这些问题呢? 我把这些问题划分成了三大部分: 常见命令有哪些坑? 数据持久化有哪些 ...
- phpstorm、goland常用快捷键
1) 文件操作相关的快捷键 快捷键 作用 Ctrl + E 打开最近浏览过的文件 Ctrl + N 快速打开某个 struct 结构体所在的文件 Ctrl + Shift + N 快速打开文件 Shi ...
- bs4库爬取天气预报
Python不仅用于网站开发,数据分析,图像处理,也常用于爬虫技术方向,最近学习了解下,爬虫技术入门一般先使用bs4库,爬取天气预报简单尝试下. 第一步:首先选定目标网站地址 网上查询,天气预报准确率 ...
- Ubuntu 下查看当前用户
博客地址:https://www.cnblogs.com/zylyehuo/ 在终端执行以下命令 whoami
