当前位置: 首页 > news >正文

常用设计模式系列(十一)—外观模式

常用设计模式系列(十一)—外观模式

第一节

前言

截止目前,我已经完成十一篇设计模式的原创文章,设计模式已经完成十个章节,我也收获了一丢丢粉丝,未来的日子有各位大佬的陪伴,我也会更加努力的高产。今天讲解对象结构型设计模式第四章节—外观模式,什么是外观模式呢?“外观”一词比较抽象,虽然这个模式不能够通过名称来一眼看出实现的过程,但是可以这么理解,一个看着漂亮又完整的整体,其实是有许多小的部分组成,一个光芒绽放的人,也是肯定一身技能在身,找到这个人,他就能做好几个人能完成的事情,他这个人本身就集中了许多人的优点。

第二节
外观模式

外观(Facade)模式又叫做门面模式,属于较为简单的一种设计模式,是通过将多个复杂的子系统进行整合,然后提供一个统一的接口,使这些子系统更加容易被访问的模式。几个子系统集中到一起时,这个模式就对外只有一个统一接口,可以访问子系统的方法,外部的程序不用关心内部系统实现的具体细节,在我们开发的过程中,许多人就会不自觉的使用外观模式。

在这里插入图片描述

在这里插入图片描述

其实这个模式很好理解,将多个子类在一个统一类进行整合,然后整合类作为统一入口使用,例如在项目开发过程中,我们的control(控制)层去调用service层进行实现,service层是整合了多个dao来完成业务开发,或者service层依赖别的service层,融合到一起,入口为这个整合的service类,control可以通过service查找dao层去数据库查询的数据,这样就能完成外观模式。

注意:外观模式就是将多个子系统的入口进行整合,在同一的接口完成,三个系统分别是三个入口,在这个接口中就是三个方法。

在这里插入图片描述

一个朋友离职以后,换了一家新的公司,然后到了新的城市需要租房子,为了快速找到房子,这个朋友就找到了房产中介,他考虑的是一室一厅或者两室一厅的房子,这个房产中介就拿着两把钥匙带着朋友看房子去了,你可以理解为中介就是外观角色,整合了资源,但是资源数不变,每个房东的房子在这里汇聚,真正的房东的房子就是子系统,房产公司就是抽象外观角色。

在这里插入图片描述

image

第三节

代码实现

本次代码实现使用一个外观角色完成,多个外观角色同理

1.创建子系统A和子系统B

package com.yang.facade;/*** @ClassName SubSystemOne* @Description 子系统——房东A* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public class SubSystemOne {/*** 一室一厅的房子*/public void oneRoom(){System.out.println("一室一厅的房子");}
}package com.yang.facade;/*** @ClassName SubSystemTwo* @Description 子系统-房东B* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public class SubSystemTwo {/*** 两室一厅的房子*/public void twoRoom(){System.out.println("两室一厅的房子");}
}

2.创建抽象外观角色

package com.yang.facade;/*** @ClassName OrderService* @Description 抽象外观* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public interface AbstractFacade {/*** 一室一厅*/public void oneRoom();/*** 两室一厅*/public void twoRoom();
}

3.创建外观角色

package com.yang.facade;/*** @ClassName Facade* @Description 外观角色(前台接待人员)* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public class Facade implements AbstractFacade {//房东Aprivate SubSystemOne subSystemOne = new SubSystemOne();//房东Bprivate SubSystemTwo subSystemTwo = new SubSystemTwo();/*** 一室一厅*/public void oneRoom() {System.out.println("中介带着看房子");subSystemOne.oneRoom();}/*** 两室一厅*/public void twoRoom() {System.out.println("中介带着看房子");subSystemTwo.twoRoom();}
}

4.创建客服端进行测试

package com.yang.facade;/*** @ClassName Client* @Description 注释* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public class Client {public static void main(String[] args) {//外观对象AbstractFacade facade = new Facade();System.out.println("去看房子");System.out.println("-----------------分割线---------------");facade.oneRoom();System.out.println("-----------------分割线---------------");facade.twoRoom();}
}

5.测试结果如下,完成了外观模式的职责

去看房子
-----------------分割线---------------
中介带着看房子
一室一厅的房子
-----------------分割线---------------
中介带着看房子
两室一厅的房子

第四节

外观模式优缺点及适用场景分析

优点:

  1. 可以将系统中多个功能的接口进行整合,在一个类中进行聚合,方便客户端使用。

  2. 外观模式降低了客户端与子系统之间的耦合度

  3. 对客户端屏蔽了子系统组件,减少了客户端使用的对象数量,也屏蔽了处理过程

缺点:

  1. 增加新的子系统时,需要修改外观角色和客户端代码,违背了设计模式的“开闭原则”。

  2. 子系统能被任何外观类使用,后期改造风险增加

适用场景:

  1. 适用于一个系统内部接口较为复杂,但需要提供统一接对外调用的场景。

  2. 当客户端使用的子系统对象过多且臃肿时,可以引入外观模式改造,提高独立性。

  3. 系统中分层进行开发时,外观模式可以隔离不同层的调用关系错乱,统一管理。

扫描二维码

关注我吧

IT小白架构师之路

image

http://www.dtcms.com/a/295608.html

相关文章:

  • VUE2 学习笔记5 动态绑定class、条件渲染、列表过滤与排序
  • 微服务-springcloud-springboot-Skywalking详解(下载安装)
  • C++中std::list的使用详解和综合实战代码示例
  • Linux进程间通信:管道机制全方位解读
  • uniapp转微信程序点击事件报错Error: Component “xx“ does not have a method “xx“解决方案
  • Linux724 逻辑卷挂载;挂载点扩容;逻辑卷开机自启
  • 【PZ-ZU7EV-KFB】——ZYNQ UltraScale + ZU7EV开发板ARM/FPGA异构计算开发平台,赋能多域智能硬件创新
  • The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(六)
  • 从“类”到“道”——Python 面向对象编程全景解析
  • J2EE模式---组合实体模式
  • 从指标定义到AI执行流:衡石SENSE 6.0的BI PaaS如何重构ISV分析链路
  • 【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍
  • Mac电脑使用IDEA启动服务后,报service异常
  • 微算法科技(NASDAQ: MLGO)研究量子信息递归优化(QIRO)算法,为组合优化问题拓展解决新思路
  • 橱柜铰链的革命:炬森精密如何以创新科技重塑家居体验
  • 详解力扣高频SQL50题之197. 上升的温度【简单】
  • 重构数据库未来:金仓数据库,抢占 AI 原生时代先机
  • 数据结构系列之红黑树
  • 亚马逊云科技:以云为翼,助你翱翔数字新天空
  • pycharm配conda环境
  • 2025年PostgreSQL 详细安装教程(windows)
  • Pycharm、Python安装及配置小白教程
  • 智能制造场景195个术语的16个分类
  • 模块化商城的快速部署之道:ZKmall开源商城如何让电商功能即插即用
  • Unity VS Unreal Engine ,“电影像游戏的时代” 新手如何抉择引擎?(1)
  • Java设计模式-适配器模式
  • vue 中什么场景使用 export default 和setup()
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现卫星图像识别(C#代码,UI界面版)
  • [数据结构]#6 树
  • Apache Commons:Java开发者的瑞士军刀