设计模式之“外观模式(门面模式)(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 ...
随机推荐
- WPF 线程处理
参考链接:https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-3.5/ms771750(v=vs.90)
- 【计算机】常见CPU指令集发展及其关系
[计算机]常见 CPU 指令集发展及其关系 CPU 与指令集 任何计算机都有一块 CPU,CPU 有其支持的指令集,根据指令集间的兼容性,一种 CPU 可能同时支持多种指令集. 指令集中记录了 CPU ...
- autMan奥特曼机器人-内置wx机器人的相关说明
内置wx机器人的相关说明 内置wxbot机器人,经常有人说在群内无回复,做以下几个工作: 给群命名 通过机器人微信APP将此群加入到通讯录 重启autMan 内置微信机器人已经支持群名设置 例如转发时 ...
- Typecho 引入JS简单的实现点击文字即可复制
在文章中插入大量无意义内容一不美观,二不便复制,不如使用 js 创建隐藏内容的复制按钮吧. 引入 JS 本主题:依次进入 控制台 - 外观 - 设置外观 - 主题自定义扩展,将以下代码加入到 自定义 ...
- thinkphp或laravel连接sql server 2014数据库
问题描述:平时使用最多为mysql数据库,目前有项目数据库为sql server 2014,列出连接全过程 首先下载安装SQLserver的odbc开放数据库链连接,下载地址:https://lear ...
- linux系统升级/更新OpenSSL版本操作流程记录
问题描述:有时OpenSSL版本过老升级,或者需要更新OpenSSL版本 1.登录linux系统后输入openssl version 查看现在使用的版本 我的输入后版本信息为:OpenSSL 1.1. ...
- 单页应用(SPA)是什么?
来源:https://zhuanlan.zhihu.com/p/648113861 概述 单页应用(SPA,Single Page Application)是一种网页应用或网站的设计模式,它在浏览器中 ...
- QWidget的isHidden和isVisible
文章目录 QWidget的isHidden和isVisible 问题的出现 QWidget的show()函数 QWidget的isVisible和isHidden 源码追溯 QWidget的isHid ...
- 如何编写Kubernetes的YAML(一)
什么是API对象 作为一个集群操作系统,Kubernetes 归纳总结了 Google 多年的经验,在理论层面抽象出了很多个概念,用来描述系统的管理运维工作,这些概念就叫做"API 对象&q ...
- 【离线地图】地图瓦片css复杂滤镜线段绘制
需求: 目前已经对地图瓦片做了复杂滤镜的黑夜展示,现在又要在这个图片上绘制新的线段等内容,且不能被这个复杂滤镜影响,变成奇奇怪怪的颜色. 同时因为框架限制,只能在这个img上绘制 思考: 1.既然不想 ...
