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

一、什么是外观模式

外观模式(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:

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

相关推荐
欧阳方超1 分钟前
Spring Boot2.x教程:(十)从Field injection is not recommended谈谈依赖注入
java·spring boot·后端
孤客网络科技工作室6 分钟前
虚幻引擎5(UE5)学习教程
java·学习·ue5
神仙别闹14 分钟前
基于 Java 语言双代号网络图自动绘制系统
java·开发语言
猫爪笔记22 分钟前
JAVA基础:单元测试;注解;枚举;网络编程 (学习笔记)
java·开发语言·单元测试
aqua353574235825 分钟前
杨辉三角——c语言
java·c语言·数据结构·算法·蓝桥杯
API快乐传递者26 分钟前
用 Python 爬取淘宝商品价格信息时需要注意什么?
java·开发语言·爬虫·python·json
yang_shengy36 分钟前
【JavaEE】认识进程
java·开发语言·java-ee·进程
阿乾之铭38 分钟前
Spring boot框架下的Java 反射
java·spring boot·后端
麻衣带我去上学1 小时前
Spring源码学习(五):Spring AOP
java·学习·spring
北欧人写代码2 小时前
idea java 项目右键new file时 为什么是 kotlin class 不是普通class
java·kotlin·intellij-idea