深度学习设计模式之外观模式

news/2024/10/19 21:40:11/

文章目录

  • 前言
  • 一、介绍
  • 二、特点
  • 三、详细分析
    • 1.核心组成
    • 2.代码示例
    • 3.优缺点
      • 优点
      • 缺点
    • 4.使用场景
  • 总结


前言

外观模式是结构型设计模式,定义一个高层接口,用来访问子系统中的众多接口,使系统更加容易使用。


一、介绍

外观设计模式(Facade Pattern)是一种常用的设计模式,属于结构型模式之一。它提供了一个统一的接口来访问一个子系统中的一组接口,从而隐藏子系统的复杂性,让子系统更容易使用。

二、特点

  • 简化接口:为复杂的子系统提供一个简化的方法来访问它的功能。
  • 隐藏复杂性:隐藏子系统内部的复杂逻辑和实现细节,客户端不需要了解内部的复杂结构。
  • 子系统独立性:Facade 不会强制子系统进行修改以符合新的接口,它们可以独立地变化和发展。
  • 灵活性:通过引入 Facade,可以很容易地添加或修改子系统的功能,同时保持客户端代码的稳定性。
  • 松耦合:Facade 模式降低了客户端与复杂子系统之间的耦合度。

三、详细分析

1.核心组成

外观角色(Facade):客户端可以调用这个角色的方法, 这个外观方法知道多个子系统的功能和实际调用。

子系统角色(SubSystem):每个子系统都可以被客户端 直接调用,子系统并不不知道门面的存在。
在这里插入图片描述

2.代码示例

外观角色抽象接口类

/*** 外观角色抽象类*/
public interface LoginSDK {void login();
}

外观角色实现类

/*** 外观角色实现类*/
public class LoginImpl implements LoginSDK {/*** 日志服务*/private LogService logService = new LogService();/*** 用户服务*/private UserService userService = new UserService();/*** 短信服务*/private SmsService smsService = new SmsService();@Overridepublic void login() {System.out.println("用户登录成功");logService.log();userService.userInfo();smsService.sendMessage();}}

子系统角色

/*** 日志子系统*/
public class LogService {public void log(){System.out.println("记录操作日志");}}
/*** 短信子系统*/
public class SmsService {public void sendMessage(){System.out.println("发送消息提醒!");}}
/*** 用户子系统*/
public class UserService {public void userInfo(){System.out.println("查询用户权限等相关信息");}}

外观设计模式测试类

/*** 测试类*/
public class FacadeTest {public static void main(String[] args) {LoginSDK loginSDK = new LoginImpl();loginSDK.login();}}

结果
在这里插入图片描述

3.优缺点

优点

  • 减少系统相互依赖,提高灵活性。

  • 符合迪米特法则,一个实体应当尽可能的少与其他实体之间发生相互作用。

缺点

  • 增加系统调用链路。

4.使用场景

  1. 当需要向客户端提供一个简单接口来访问复杂系统中的一组操作时。
  2. 当需要为复杂的类层次结构提供一个简单接口时。
  3. 当需要通过一个中间层来简化客户端与复杂系统的交互时。

总结

外观设计模式在实际开发中非常有用,特别是在处理大型复杂系统时,它可以帮助我们简化客户端的交互过程,提高系统的可维护性和可扩展性。


http://www.ppmy.cn/news/1511745.html

相关文章

Java-分割list并执行多线程任务的工具类

要创建一个用于分割列表并执行多线程任务的工具类,你可以使用 Java 的 ExecutorService 和 ThreadPoolExecutor 来实现。下面是一个详细的示例,展示了如何创建这样一个工具类。 步骤 1: 创建线程池 首先,创建一个线程池来执行任务。 步骤 2: 分割列表 接着,定义一个方…

Android12 显示框架之Transaction----client端

目录:Android显示终极宝典 在前面的章节中,应用通过createSurface()在surfaceflinger中创建了一层layer,紧接着要做的事情就是对这个layer设置一些属性(或者叫状态),常设置的属性有位置、大小、z-order等等…

利用Proxy302构建高效代理IP平台:从功能到架构解析

在现代互联网环境中,代理IP已成为企业和个人在隐私保护、网络爬虫、广告验证等场景中的关键工具。在众多代理IP平台中,如何选择一个高效且易用的平台?怎么搭建企业自己的代理IP平台,本文将从多个维度对进行深度分析与简易架构拆解…

8月编程语言排行榜公布!Python份额首次超过18%,已成霸主!

1.排名榜单 前20名 21-50名 51-100名 第 51-100 名如下,由于它们之间的数值差异较小,仅以文本形式列出(按字母排序): 2.榜单亮点 Python份额首次超过18% TIBOE官方在8月榜单中给出的标题是“Python正在追逐Java的TIO…

Ps:帧动画 - 帧处理方法

帧处理方法 Frame Disposal Method,指的是在播放帧动画时,Photoshop 如何处理每一帧之间的切换。特别是当帧有透明背景时,处理方法会影响当前帧是否在下一帧出现时被隐藏。 简单来说,有三种处理方法,可在帧的缩览图右键…

无人机测绘技术及应前景详解

无人机测绘技术是一种将无人机技术、遥感技术、地理信息系统(GIS)和计算机技术相结合,对自然地理要素或地表人工设施的形状、大小、空间位置及其属性等进行测定、采集并绘制成图的技术。它利用高精度传感器(如激光雷达、航拍相机等…

JavaScript - Ajax

Asynchronous JavaScript And XML,异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术…

使用 `<springProperty>` 在 Logback 配置中引用 Spring 应用程序属性

在 Spring Boot 应用程序中,日志配置通常是一个至关重要的任务。使用 Logback 作为日志框架时,能够动态地引用 Spring 应用程序中的属性值是非常有用的。这不仅使日志配置更加灵活,还能确保日志格式与应用程序配置保持一致。本文将介绍 Logba…