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

news/2024/11/6 17:22:36 标签: 设计模式, 外观模式, java

一、什么是外观模式

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

二、外观模式的角色

  1. Facade(外观)

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

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

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

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

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

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

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

1. 定义Bean接口和实现类

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

java">// 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的访问:

java">// 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交互:

java">// 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隐藏了系统的复杂性,提供了一个简化的接口给客户端使用,符合外观模式的定义。


http://www.niftyadmin.cn/n/5741092.html

相关文章

2024 - pathlinkR:差异分析 + 蛋白互作 + 功能富集网络可视化

微阵列和RNA-Seq等基因表达研究常常会产生成百上千个差异表达基因 (DEG)。要了解这种海量数据集的生物学意义变得非常困难&#xff0c;尤其是在存在多种条件和比较的情况下。 ▲ 常规的RNA测序分析流程。图片来源&#xff1a;10.1186/s12859-018-2486-6。 为此&#xff0c;来自…

Vue3 -- 新组件【谁学谁真香系列6】

Teleport Teleport是什么?–Teleport是一种能够将我们的组件html结构移动到指定位置的技术。 父组件: <template><div calss="outer"><h2>我是App组件</h2><img src="https://z1.ax1x.com/2023/11/19/piNxLo4.jpg" alt=&qu…

WordPress 中最佳的维护服务:入门级用户指南

如果你是WordPress网站管理员&#xff0c;一定知道网站维护既耗时又复杂。然而&#xff0c;保持网站的正常运行和安全却至关重要。为了让你轻松应对这个挑战&#xff0c;我们总结了一些适合新手和小型网站的维护服务。本文将介绍两款适合初学者的维护服务&#xff1a;FixMySite…

Linux入门(2)

林纳斯托瓦兹 Linux之父 1. echo echo是向指定文件打印内容 ehco要打印的内容&#xff0c;不加任何操作就默认打印到显示器文件上。 知识点 在Linux下&#xff0c;一切皆文件。 打印到显示器&#xff0c;显示器也是文件。 2.重定向 >重定向操作&#xff0c;>指向的…

vue3自定义element-plus主题色

第一步&#xff1a;创建一个scss文件&#xff0c;用于存放自定义颜色值&#xff1b; /* 只需要重写你需要的即可 */ forward element-plus/theme-chalk/src/common/var.scsswith ($colors: (white: #ffffff,black: #000000,primary: (base: #0f87ff,),success: (base: #67c23a…

SQL常见语法

select * from student; select&#xff1a;选取 from&#xff1a;来源 *&#xff1a;所有栏位 select 姓名&#xff0c;班级&#xff0c;成绩 from students; 选取特定栏位 select 姓名&#xff0c;班级&#xff0c;成绩 from students limit 5;--限制显示拦数 select 姓…

13-鸿蒙开发中的综合实战:华为登录界面

大家好&#xff0c;欢迎来到鸿蒙开发系列教程&#xff01;今天&#xff0c;我们将通过一个综合实战项目来实现一个华为登录界面。这个项目将涵盖输入框组件、按钮组件、文本组件和布局容器的使用&#xff0c;帮助你更好地理解和应用这些组件。无论你是初学者还是有一定经验的开…

linux shell脚本学习(1):shell脚本基本概念与操作

1.什么是shell脚本 linux系统中&#xff0c;shell脚本或称之为bash shell程序&#xff0c;通常是由vim编辑&#xff0c;由linux命令、bash shell指令、逻辑控制语句、注释信息组成的可执行文件 *linux中常以.sh后缀作为shell脚本的后缀。linux系统中文件乃至脚本的后缀并没有…