【设计模式系列】外观模式(十四)

一、什么是外观模式

外观模式(Facade Pattern)是一种结构型设计模式,其核心目的是为一个复杂的子系统提供一个简化的接口。这种模式通过定义一个外观类来封装子系统内复杂的操作,隐藏系统内部的复杂性,并向客户端提供一个客户端可以访问系统的接口,同时对客户端隐藏内部的细节。

二、外观模式的角色

  1. Facade(外观)

    • 功能:外观角色是为子系统提供的一个简化接口。它封装了子系统内部的复杂性,同时提供了一组更高层次的操作来实现这些功能。外观角色通常包含指向子系统组件的引用,并在内部将客户端的请求委托给一个或多个子系统组件。它为子系统定义了一个高层接口,使得子系统更容易使用,同时隐藏了系统的细节和复杂性。
    • 特点:外观角色通常是一个具体类,它实现了子系统中所有方法的调用逻辑,并且可能包含子系统中对象的实例。
  2. Subsystem(子系统)

    • 功能:子系统角色实现了子系统的功能,并且可以被外观角色调用。子系统可以包含一个或多个对象,每个对象都包含了特定的功能。这些子系统对象对外观角色的实现细节一无所知,它们只是简单地提供自己的业务逻辑。
    • 特点:子系统角色可以是一个接口或抽象类,以及实现这些接口或抽象类的多个具体类。它们独立于外观角色,即使没有外观角色,子系统也可以独立工作。

三、外观模式的典型应用场景

  1. 复杂的类库:当一个库有很多复杂的类,且这些类的使用需要深入了解库的内部结构时,可以通过一个外观类提供一个简单的接口来简化客户端的使用。

  2. 系统集成:在多个子系统集成到一个大型系统中时,每个子系统可能都有自己的接口。外观模式可以用来提供一个统一的接口,隐藏子系统间的复杂交互。

  3. 第三方接口封装:当需要与第三方服务或API交互时,外观模式可以封装这些服务的细节,提供一个更简单、更符合本地应用习惯的接口。

四、外观模式在BeanFactory中的应用

1. 定义Bean接口和实现类

首先,定义一些bean的接口和实现类:

// MessageService.java
public interface MessageService {
    void sendMessage(String message);
}

// EmailService.java
import org.springframework.stereotype.Component;

@Component
public class EmailService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Sending email: " + message);
    }
}

// SMSService.java
import org.springframework.stereotype.Component;

@Component
public class SMSService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Sending SMS: " + message);
    }
}

2. 定义BeanFactory外观类

接下来,定义一个BeanFactory外观类,它封装了对BeanFactory的访问:

// MessageServiceFacade.java
import org.springframework.beans.factory.BeanFactory;

public class MessageServiceFacade {
    private BeanFactory beanFactory;

    public MessageServiceFacade(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    public void sendEmail(String message) {
        MessageService emailService = beanFactory.getBean("emailService", MessageService.class);
        emailService.sendMessage(message);
    }

    public void sendSMS(String message) {
        MessageService smsService = beanFactory.getBean("smsService", MessageService.class);
        smsService.sendMessage(message);
    }
}

3. 配置Spring BeanFactory

在Spring的配置文件中,配置EmailServiceSMSService bean:

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="emailService" class="com.example.EmailService"/>
    <bean id="smsService" class="com.example.SMSService"/>
</beans>

4. 客户端代码

最后,客户端代码使用MessageServiceFacade来发送消息,而不需要直接与BeanFactory交互:

// Client.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        BeanFactory beanFactory = context;
        
        MessageServiceFacade messageServiceFacade = new MessageServiceFacade(beanFactory);
        messageServiceFacade.sendEmail("Hello via Email");
        messageServiceFacade.sendSMS("Hello via SMS");
    }
}

在这个示例中,MessageServiceFacade作为一个外观类,简化了对BeanFactory的访问。客户端代码通过MessageServiceFacade来发送邮件和短信,而不需要知道具体的MessageService实现类或BeanFactory的细节。这样,MessageServiceFacade隐藏了系统的复杂性,提供了一个简化的接口给客户端使用,符合外观模式的定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/910716.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哪些因素会影响 DC/DC 转换电路快速测试的性能?-纳米软件

DC/DC 转换电路在现代电子设备中起着至关重要的作用&#xff0c;其性能的快速准确测试对于确保电子系统的可靠性和稳定性至关重要。然而&#xff0c;有许多因素会影响 DC/DC 转换电路快速测试的性能。 电路复杂性和参数多样性 单片 DC/DC 转换器由于功能模块和参数复杂性&…

从0开始深度学习(25)——多输入多输出通道

之前我们都只研究了一个通道的情况&#xff08;二值图、灰度图&#xff09;&#xff0c;但实际情况中很多是彩色图像&#xff0c;即有标准的RGB三通道图片&#xff0c;本节将更深入地研究具有多输入和多输出通道的卷积核。 1 多输入通道 当输入包含多个通道时&#xff0c;需要…

2025天津市考8日报名,建议收藏好报名流程

天津市2025年招考2043名公务员公告 35周岁以下&#xff08;1988年11月至2006年11月期间出生&#xff09;&#xff0c;2025年应届硕士、博士研究生报考的&#xff0c;年龄可放宽到40周岁&#xff08;1983年11月以后出生&#xff09;&#xff1b; 报名时间&#xff1a;2024年11月…

25中海油笔试测评春招秋招校招暑期实习社招笔试入职测评行测题型微测网题型分享

中海油笔试一般采用线上机考的形式。考试时间为 120 分钟&#xff0c;满分 100 分。笔试内容主要包括思想素质测评和通用能力测评两个科目。以下是具体介绍&#xff1a; 1. 思想素质测评&#xff1a; ✅价值观&#xff1a;考察考生对工作、职业、企业等方面的价值观念和态度&…

使用Docker Compose构建多容器应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Docker Compose构建多容器应用 引言 Docker Compose 简介 安装 Docker Compose 创建基本配置 运行多容器应用 查看服务状态 …

【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)

本篇文章分享关于如何使用STM32单片机对彩色摄像头&#xff08;OV7725/OV2604&#xff09;采集的图像数据进行分析处理&#xff0c;最后实现颜色的识别和检测。 目录 一、什么是颜色识别 1、图像采集识别的一些基本概念 1. 像素&#xff08;Pixel&#xff09; 2. 分辨率&am…

精心整理教育研究专题数据资源大全-最新出炉_附下载链接

教育研究专题数据资源大全V1.0 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;教育研究专题数据资源大全-最新出炉.zip 资源介绍 一、中国教育统计年鉴面板数据 简介&#xff1a;《中国教育统计年鉴》是由教育部发展规划司根据全国各省、自治区、直辖市…

【论文速读】| PathSeeker:使用基于强化学习的越狱攻击方法探索大语言模型的安全漏洞

基本信息 原文标题: PathSeeker: Exploring LLM Security Vulnerabilities with a Reinforcement Learning-Based Jailbreak Approach 原文作者: Zhihao Lin, Wei Ma, Mingyi Zhou, Yanjie Zhao, Haoyu Wang, Yang Liu, Jun Wang, Li Li 作者单位: Beihang University, Nany…

越权访问漏洞

V2Board Admin.php 越权访问漏洞 ## 漏洞描述 V2board面板 Admin.php 存在越权访问漏洞&#xff0c;由于部分鉴权代码于v1.6.1版本进行了修改&#xff0c;鉴权方式变为从Redis中获取缓存判定是否存在可以调用… V2Board Admin.php 越权访问漏洞 漏洞描述 V2board面板 Admin.ph…

27.旅游推荐管理系统(基于springboot和vue)

目录 1.系统的受众说明 2. 系统需求分析 2.1 任务概述 2.2 功能性需求 2.3 非功能性需求 2.3.1正确性需求 2.3.2安全性需求 2.3.3界面需求 2.3.4时间特殊性需求 2.3.5稳定性需求 2.3.6故障处理能力需求 2.4 开发技术简介 2.4.1 开发工具简介 2.4.2 开发技术…

CCS下载安装(以12.3.0版本为例)

Code Composer Studio 是一个集成开发环境 (IDE)&#xff0c;简称CCS软件。支持 TI 的微控制器和嵌入式处理器产品的开发。Code Composer Studio 包含一整套用于开发和调试嵌入式应用程序的工具。 CCS9.3.0及以上版本不需要License文件&#xff0c;但是CCS旧版本比如CCS5.5.0需…

基于单片机的变频空调系统设计(论文+源码)

1系统总体方案设计 本次基于单片机的变频空调系统设计&#xff0c;选用STC89C52单片机作为系统的主控核心&#xff0c;结合DHT11温湿度传感器实现家居环境中温湿度数据的检测&#xff0c;并设有自动和手动两种模式&#xff0c;在自动模式下&#xff0c;系统会根据按键设定的温…

Visual Studio Code从安装到正常使用

Visual Studio Code的汉化 下载的Visual Studio Code的话可以去应用商店也可以去官网下载。 Visual Studio Code只是一个编译器&#xff0c;不具备编译器功能。因此需要下载一个编译器MinGW MinGW的安装 官网链接MinGW官网链接 一步到位的链接 添加环境变量 进入cmd界面…

图神经网络初步实验

实验复现来源 https://zhuanlan.zhihu.com/p/603486955 该文章主要解决问题&#xff1a; 1.加深对图神经网络数据集的理解 2.加深对图神经网络模型中喂数据中维度变化的理解 原理问题在另一篇文章分析&#xff1a; 介绍数据集&#xff1a;cora数据集 其中的主要内容表示为…

雪花算法生成的ID在返回给前端之后和生成的不一样,到底是什么原因?

一、背景&#xff1a; 最近在做项目的时候发现用雪花算法生成的id传给前端以后跟生成的不一样&#xff0c;就纳闷&#xff0c;在想为什么会出现这样的问题&#xff1f; 二、问题分析&#xff1a; 最开始以为是序列化的问题导致的仔细对比以后发现前端是后几位不一样都是0&…

【大数据学习 | kafka高级部分】kafka中的选举机制

controller的选举 首先第一个选举就是借助于zookeeper的controller的选举 第一个就是controller的选举&#xff0c;这个选举是借助于zookeeper的独享锁实现的&#xff0c;先启动的broker会在zookeeper的/contoller节点上面增加一个broker信息&#xff0c;谁创建成功了谁就是主…

js例轮播图定时器版

要求 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-width, ini…

jvm学习笔记-轻量级锁内存模型

一&#xff0c;轻量级锁 LockRecord的那个第一个成员变量是拷贝对应锁定了的java对象资源的MarkWord&#xff0c;Lock Record有一个Ptr指针刚开始指向自己&#xff0c;后面这个指针存储在锁定资源的java对象的markword中&#xff0c;后续可以通过java对象的MarkWord快速定位到…

职场浅谈:情商高的“4”种表现,情商高的人才更容易走向成功

职场上&#xff0c;情商高的人总是让人感觉很舒服&#xff0c;也让人情不自禁的愿意和他交往。高情商的人&#xff0c;最大的优点就是让人感觉舒服&#xff0c;这种舒服由内自外&#xff0c;让你情不自禁的对他产生好感&#xff0c;并且发自内心的愿意和他在一起&#xff0c;也…

win11电脑无法找到声音输出设备怎么办?查看解决方法

电脑无法找到声音输出设备是一个常见的问题&#xff0c;尤其是在使用Windows操作系统时。幸运的是&#xff0c;大部分问题都可以通过以下几种方法来解决。 一、检查物理连接 在深入诊断之前&#xff0c;首先要检查硬件连接是否正常。这包括&#xff1a; 确保耳机、扬声器或其…