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

news2024/11/15 20:33:26

文章目录

  • 前言
  • 一、介绍
  • 二、特点
  • 三、详细分析
    • 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();

    @Override
    public 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.coloradmin.cn/o/2054351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码与AI:赋能企业数字化转型

引言 随着全球经济的快速发展和科技的飞速进步,数字化转型已成为各个行业和企业发展的重要趋势。数字化转型的背景不仅是提升效率和竞争力的手段,更是适应市场变化、满足客户需求的必由之路。 在当今信息化时代,技术的变革推动了企业运营方式…

【Python机器学习】MapReduce(分布式计算的框架)

MapReduce的优缺点: 优点:可在短时间内完成大量工作; 缺点:算法必须经过重写,需要对系统工程有一定的理解; 适用数据类型:数值型和标称型数据。 MapReduce是一个软件框架,可以将单个…

SQL UA注入 (injection 第十八关)

简介 SQL注入(SQL Injection)是一种常见的网络攻击方式,通过向SQL查询中插入恶意的SQL代码,攻击者可以操控数据库,SQL注入是一种代码注入攻击,其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&a…

[Python学习日记-10] Python中的流程控制(if...else...)

简介 假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动作的。你要判断那条岔路是你真正要走的路,如果我们想…

合宙LuatOS AIR700 IPV6 TCP 客户端向NodeRed发送数据

为了验证 AIR700 IPV6 ,特别新建向NodeRed Tcp发送的工程。 Air700发送TCP数据源码如下: --[[ IPv6客户端演示, 仅EC618系列支持, 例如Air780E/Air600E/Air780UG/Air700E ]]-- LuaTools需要PROJECT和VERSION这两个信息 PROJECT "IPV6_SendDate_N…

Leetcode面试经典150题-155.最小栈

解法都在代码里,不懂就留言或者私信 我写了两种解法,建议选择双栈的,感觉这才是考察点 /**一般解法:过个笔试没问题,建议用双栈的方法 */ class MinStack2 {/**至少应该有一个栈用于保存数据 对于push和pop以及top的话…

STM32之SPI读写W25Q128芯片

SPI简介 STM32的SPI是一个串行外设接口。它允许STM32微控制器与其他设备(如传感器、存储器等)进行高速、全双工、同步的串行通信。通常包含SCLK(串行时钟)、MOSI(主设备输出/从设备输入Master Output Slave Input&…

【React Hooks - useState状态批量更新原理】

概述 所谓批量处理就是当在同时更新多个状态下,能够统一批量处理更新,避免了重复渲染。在React17及之前版本,React只会在合成事件以及生命周期内部进行批量处理,在setTimeout、Promise、Fetch等异步请求中,则不会自动…

【GH】【EXCEL】P1: Write DATA SET from GH into EXCEL

文章目录 WriteFast WriteGH data material :GH process and components instructionFast Write DataFast Write Data & Clear DataFast Write to Cell EXCEL written results Write by ColumnGH data material :Compile ColumnGH process and components instructionWrite…

三、Kafka副本

2、创建2个分区两个副本 /usr/local/kafka/bin# ./kafka-topics.sh --bootstrap-server 192.168.58.130:9092 --create --topic atguigu2 --partitions 2 --replication-factor 23、查看topic详细信息 /usr/local/kafka/bin# ./kafka-topics.sh --bootstrap-server 192.168.5…

如何理解CAPL—Test编程中的测试对象

前言:CAPL—Test编程中的对象,是一个比较复杂的概念,对象的作用是作为Test特定函数的参数。来执行特定的功能(这是比较复杂的一个概念,下文会慢慢讲解)。 注意:因为翻译的问题,有些…

arm:ADC模数转换器

比较器 AD&#xff1a; 精度&#xff1a;10位 转换速率&#xff1a;500 KSPS 量程&#xff1a;0~3.3v void adc_init(void) {ADCCON (1 << 14) | (49 << 6) | (1 << 1); }unsigned short adc_read(void) {unsigned short value ADCDAT0;while(~(ADCCON &am…

华为M60首次降价,消费回暖能延续?

导语 8月15日&#xff0c;华为Mate 60系列首次官宣降价&#xff01;能否带动消费电子进一步回暖&#xff1f; 在当前全球经济形势复杂多变的背景下&#xff0c;各行各业都在寻求新的增长点和突破口。 消费电子市场作为科技与日常生活紧密结合的重要领域&#xff0c;其发展态势一…

基于HarmonyOS的宠物收养系统的设计与实现(一)

基于HarmonyOS的宠物收养系统的设计与实现&#xff08;一&#xff09; 本系统是简易的宠物收养系统&#xff0c;为了更加熟练地掌握HarmonyOS相关技术的使用。 项目创建 创建一个空项目取名为PetApp 首页实现&#xff08;组件导航使用&#xff09; 官方文档&#xff1a;组…

微服务中的Sidecar模式

微服务中的Sidecar模式 什么是sidecarsidecar如何工作Sidecar 代理服务注册发现Sidecar 代理异构服务发起服务调用异构服务如何被调用 常见应用以MOSN流量接管为例使用 sidecar 模式的优势sidecar和面向切片编程AOP的关系参考 什么是sidecar sidecar是服务网络架构的产物。 S…

【网络】 arp 命令 得到网段内所有物理设备ip

我的笔记本和 NVIDIA Jetson Orin 都位于同一个 192.168.1.x 的网段内&#xff0c;我想远程访问 Orin&#xff0c;但我不知道orin的ip 方法 1: 使用 arp 命令 打开命令提示符&#xff1a; 按下 Win R 键&#xff0c;打开“运行”对话框。输入 cmd 并按 Enter 键打开命令提示符…

JAVA类加载过程/类装载的执行过程/java类加载机制/JVM加载Class文件的原理机制?

JAVA类加载过程/类装载的执行过程/java类加载机制/JVM加载Class文件的原理机制&#xff1f; 类加载的过程主要分为三个部分&#xff1a;&#xff08;加链初&#xff0c;验准解&#xff09; 加载链接初始化 而链接又可以细分为三个小部分&#xff1a; 验证准备解析 骚戴理解…

散点图适用于什么数据 thinkcell散点图设置不同颜色

在数据可视化的众多工具和技巧中&#xff0c;散点图是一种极为有效的方式&#xff0c;能够揭示变量之间的关系&#xff0c;尤其是在探索数据集的相关性、分布趋势、集群现象时。而在众多助力于制作高质量散点图的工具中&#xff0c;think-cell插件以其高效的操作和丰富的功能&a…

重定向与追加

1、>和>> > 【重定向】 如果文件不存在&#xff0c;则创建&#xff0c;并将内容输入到文件&#xff1b; 如果文件存在&#xff0c;则先清空文件&#xff0c;然后将内容输入到文件&#xff1b;>> 【追加】 如果文件不存在&#xff0c;则创建&…

自监督学习self-supervised learning

Tags: #tutorial #machine-leanring #self-supervised 目录&#xff1a; The Importance of Self-Supervised Learning Popular Learning Methods Introduction to Self-Supervised Learning 1. The Inportance of Self-Supervised Learning 监督学习(supervised learnin…