设计模式之“外观模式(门面模式)(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 ...
随机推荐
- IPTools for .NET:快速查询全球IP信息
IPTools 是一个用于快速查询全球 IP 地址信息的库,支持国内和国际 IP 查询,提供详细的地理位置信息(如国家.省份.城市)以及经纬度等数据. 1. IPTools.China IPTools ...
- 库卡机器人KR120示教器日常保养技巧
库卡机器人KR120是一款高效.精准的工业机器人,广泛应用于各个领域.然而,要确保其长期稳定运行,日常的保养和维护至关重要.下面,我们将为您介绍库卡机器人KR120示教器的日常保养 ...
- Deepseek学习随笔(9)--- 清华大学发布Deepseek赋能职场(附网盘链接)
作为一名职场人,在工作中常常面临效率瓶颈:如何快速生成高质量内容?如何高效处理复杂任务?这些问题在接触了<清华大学-DeepSeek赋能职场>这份文档后,得到了全新的解答.这份由清华大学新 ...
- Azure Data Factory - [01] 触发器
题记部分 一.概述 Azure Data Factory(后面简称ADF)的触发器是一种机制,用于在特定事件发生时自动执行数据管道.触发器可以基于事件间隔.数据变化或其他外部事件来启动数据管道的执 ...
- redis - [05] Java & Redis
题记部分 一.准备工作 下载jedis.jar或者在maven配置文件中配置jar包依赖 二.连接redis import redis.clients.jedis.Jedis; public clas ...
- Flume - [05] Hbase sink
一.概述 此接收器将数据写入Hbase.Hbase配置是从类路径中遇到的第一个Hbase-site.xml获取的.由配置指定的实现 HbaseEventSerializer 的类用于将事件转换为 ...
- Windows 提权-SeImpersonatePrivilege 特权
本文通过 Google 翻译 SeImpersonatePrivilege – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- 数据库离程序员有多远 - cnblogs救园行动感想
这两周,我参与了博客园的"2024救园行动",成了终身会员.说实话,当初报名的时候,我心里还挺兴奋的,想着这下能和不少老朋友在这个社区里再次相聚.毕竟,在数据库行业摸爬滚打了这么多 ...
- 「一」nginx介绍
应用场景 静态资源(js.css.图片 ) 反向代理 缓存加速(动态资源),比如社区活跃度排名 负载均衡(动态扩容.容灾) API服务 一个请求先经过nginx,再到应用服务器,访问数据库/redis ...
- 北京大学DeepSeek系列教程:《DeepSeek与AIGC应用》
前言 今天大姚分享一个由北京大学推出的DeepSeek系列学习教程<DeepSeek与AIGC应用>,该文档全面介绍了DeepSeek-R1模型的技术特性.应用场景及其在AIGC领域的重要 ...