设计模式:外观模式

2023-09-17 16:18:07

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端能够更简单地使用子系统的功能。

外观模式的核心思想是将复杂的子系统封装在一个外观类中,客户端只需要与外观类进行交互,而不需要直接与子系统的各个组件进行交互。外观类充当了客户端与子系统之间的中间层,简化了客户端的操作过程。

通过外观模式,客户端可以通过调用外观类的方法来完成一系列复杂的操作,而无需了解子系统内部的具体实现细节。外观模式提供了一种简单、直观的接口,使得客户端能够更方便地使用子系统的功能。

组件

  1. 子系统类:子系统中的具体类或对象,负责完成特定的功能或任务。
  2. 外观类:外观模式的核心,封装了子系统的组件,并提供简化的接口给客户端使用。
  3. 客户端:使用外观模式的代码,通过外观类来访问子系统的功能,而不需要直接与子系统的组件进行交互。
  4. 接口:子系统中的各个组件可能会定义接口,用于定义其行为和规范。
  5. 工具类:在外观模式中,可能会使用一些工具类来辅助封装和管理子系统的组件。

代码实例

// 子系统类A
class SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA operation");
    }
}
 // 子系统类B
class SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB operation");
    }
}
 // 外观类
class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
     public Facade() {
        subsystemA = new SubsystemA();
        subsystemB = new SubsystemB();
    }
     public void operation() {
        subsystemA.operationA();
        subsystemB.operationB();
    }
}
 // 客户端代码
public class Main {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.operation();
    }
}

在上面的示例中,我们有两个子系统类(SubsystemA和SubsystemB),它们分别实现了不同的操作。然后我们创建了一个外观类(Facade),它封装了这两个子系统,并提供了一个简化的接口给客户端使用。最后,在客户端代码中,我们通过实例化外观类并调用其操作方法来使用外观模式。

这个示例展示了外观模式如何通过封装子系统的复杂性,提供一个简化的接口给客户端使用。客户端只需要与外观类交互,而不需要直接与子系统的组件进行交互。

源码中应用

在源码中,外观模式有很多应用场景。以下是一些常见的源码中应用外观模式的情况:

  1. Java标准库中的类:

    • java.util.Collections类提供了一系列静态方法,封装了对集合的常见操作,如排序、查找等。
    • javax.servlet.http.HttpServlet类封装了处理HTTP请求的方法,简化了开发Web应用的过程。
  2. Spring框架中的类:

    • org.springframework.jdbc.core.JdbcTemplate类封装了与数据库交互的方法,简化了数据库操作的流程。
    • org.springframework.web.servlet.DispatcherServlet类作为前端控制器,封装了处理HTTP请求的逻辑,简化了Web应用的开发。

优缺点

优点:

  1. 简化客户端使用:外观模式提供了一个简化的接口给客户端使用,隐藏了子系统的复杂性,使得客户端更容易理解和使用。
  2. 解耦子系统和客户端:外观模式将子系统与客户端解耦,使得它们可以独立演化,互不影响。
  3. 提高代码的可维护性:通过外观模式,将复杂的子系统封装在一个外观类中,使得系统更易于维护和修改。

缺点:

  1. 不符合开闭原则:当需要修改或添加子系统的功能时,可能需要修改外观类,违背了开闭原则。
  2. 增加了类的数量:引入外观模式会增加一个外观类,可能会导致类的数量增加,增加了系统的复杂性。

总结

外观模式通过封装子系统的复杂性,提供了一个简化的接口给客户端使用。它简化了客户端的操作过程,提高了代码的可维护性。然而,使用外观模式需要权衡其优点和缺点,确保合理使用。

更多推荐

快速用Python进行数据分析技巧详解

概要一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正的生产力助推器。所以,这里有一些小提示和小技巧,有些可能是新的,但我相信在下一个数据分析项目中会让你非常方便。Pandas中数据框数据的P

基于JAVA+SSM+微信小程序+MySql的图书捐赠管理系统设计与实现

✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取项目下载方式🍅一、项目背景介绍:在当今社会,图书捐赠是一种普遍而有益的行为,旨在促进阅读、教育和知识传播。图书捐赠可

手动模式配置链路聚合

以下图配置为例:各PC配置如下配置LSW1#划分vlan1030<Huawei>sysEntersystemview,returnuserviewwithCtrl+Z.[Huawei]sysnameLSW1[LSW1]diSep16202314:23:44-08:00LSW1DS/4/DATASYNC_CFGCHANG

记:sx1278芯片

目录lora数字接口静态配置寄存器状态寄存器lora模式FIFO数据缓存数字IO引脚映射FIFO操作原理lora调制解调器操作模式LoRa调制解调器状态机序列数据发送序列数据接收序列单一接收操作模式连续接收操作模式从FIFO数据缓存提取有效负载数据基于前导码起始的数据包过滤lora数字接口lora调制解调器有三种数字接

计算物理专题----随机游走实战

计算物理专题----随机游走实战Problem1Implementthe3Drandomwalk拟合线自旋的拟合函数(没有数学意义)参数:0.627,3.336,0.603,-3.234自由程满足在一定范围内的均匀分布以标准自由程为单位长度,可得到均匀分布的统计特征方均根距离与平均自由程的比值满足P1-a.pyimpo

【Redis】深入探索 Redis 的哨兵(Sentinel)机制原理,基于 Docker 模拟搭建 Redis 主从结构和哨兵分布式架构

文章目录一、对RedisSentinel的认识1.1什么是RedisSentinel1.2为什么要使用RedisSentinel1.2.1主从复制问题1.2.2人工恢复主节点故障二、RedisSentinel原理剖析2.1RedisSentinel架构2.2Raft算法和领袖节点2.3哨兵节点2.4故障检测2.5故障切

JimuReport积木报表 v1.6.2 版本正式发布—开源免费的低代码报表

项目介绍一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等!Web版报表设计器,类似于excel操作风格,通过拖拽完成报表设计。秉承“简单、易用、专业”的产品理念,极大的降低报表开发难度、缩短开发周期、节省成本、解决各类报表难题。领先的企业级Web

BIO AIO NIO 的区别

BIOAIONIO是Java中用于I/O操作的三种不同的编程模型。它们的区别在于它们执行I/O操作的方式和效率。在讲BIO,NIO,AIO之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。同步与异步同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。异步:异步就是发起一个调用后,立刻得到被调用者的

基于Qt4开发曲线绘制交互软件Plotter

目前市面上有很多曲线绘制软件,但其交互功能较差。比如,想要实现数据的交互,同步联动等,都需要大量繁琐的人工操作。所以讲想开发一款轻量级的曲线绘制交互软件。下面就以此为案例,记录一下基于Qt4的开发过程。目录1需求2技术路线3开发流程1框架搭建2菜单3数据改动和右键菜单4阶段性测试5多条曲线问题6颜色和风格设置7绘图的清

如何将Docker与Kubernetes集成,实现云原生应用程序

文章目录1.容器化应用程序2.将镜像推送到容器仓库3.部署到Kubernetes4.应用程序扩展和管理DockerSwarmvs.Kubernetes:容器编排的比较1.配置和学习曲线2.功能和生态系统3.扩展性和容错性4.社区和支持🎈个人主页:程序员小侯🎐CSDN新晋作者🎉欢迎👍点赞✍评论⭐收藏✨收录专栏:云

SEO方案尝试--Nuxtjs项目基础配置

Nuxtjs最新版Nuxt3项目配置安装nuxtjs最新版Nuxt3参考官网安装安装插件安装ElementPlus页面怎么跳转,路由怎么实现404页面该怎么配置配置网页的title安装nuxtjs最新版Nuxt3参考官网安装安装插件安装ElementPlus安装ElementPlus和图标库#首先,使用以下命令安装El

热文推荐