设计模式Java实现-外观模式

✨这里是第七人格的博客✨小七,欢迎您的到来~✨

🍅系列专栏:设计模式🍅

✈️本篇内容: 外观模式✈️

🍱本篇收录完整代码地址:gitee.com/diqirenge/d... 🍱

楔子

外观模式是一种结构型设计模式,它提供了一种简化接口的方式。它的基本实现思想就是在调⽤⽅与接⼝提供⽅之间再抽象⼀个中间层,⽤于包装逻辑并提供统一的API接⼝。在日常开发中你肯定经常听到把这两个接⼝包装⼀下,这种就可以用到外观模式。

需求背景

假设我们正在开发一个支付系统,该系统需要与几个不同的支付网关(如 微信 和 支付宝)进行交互以处理在线支付。

分析设计

根据需求,我们可以提供一个统一的接口,使客户端应用程序不需要关心与哪个特定支付网关进行交互,也不需了解如何与每个支付网关的具体细节,直接调用我们抽象的外观类的方法就行了。并且为了隐藏创建类的细节,我们还可以考虑结合使用单例和工厂模式。

UML图

根据分析设计,我们可以先画一个简单的UML图,后面通过UML图编码

模块名称

facade

模块地址

gitee.com/diqirenge/d...

模块描述

外观模式代码示例

代码实现

1、首先我们创建一个平平无奇的接口

java 复制代码
/**
 * 平平无奇的接口
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/07
 */
public interface PaymentGateway {
    void pay(String amount);
}

2、然后,我们创建两个实现了PaymentGateway接口的类,分别代表不同的支付网关

java 复制代码
/**
 * 支付网关 - 支付宝
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/07
 */
public class AliGateway implements PaymentGateway {
    @Override
    public void pay(String amount) {
        System.out.println("通过支付宝支付:" + amount);
    }
}
java 复制代码
/**
 * 支付网关 - 微信
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/07
 */
public class WeChatGateway implements PaymentGateway {
    @Override
    public void pay(String amount) {
        System.out.println("通过微信支付:" + amount);
    }
}

3、编写工厂,以便使用工厂模式创建具体对象

java 复制代码
/**
 * 创建支付网关的工厂类
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/07
 */
public class PaymentFactory {

    private PaymentFactory() {
    }

    public static PaymentGateway getGatewayService(String amount) {
        if (new BigDecimal(amount).compareTo(new BigDecimal("10000")) > 0) {
            return new AliGateway();
        } else {
            return new WeChatGateway();
        }
    }

}

4、编写外观类

可以将这个外观类做成单例的,然后使用工厂创建具体对象,调用方法

java 复制代码
/**
 * 支付网关的外观类
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/07
 */
public class PaymentFacade implements PaymentGateway {
    private static volatile PaymentFacade INSTANCE;

    private PaymentFacade() {
    }

    public static PaymentFacade getInstance() {
        if (null == INSTANCE) {
            synchronized (PaymentFacade.class) {
                if (null == INSTANCE) {
                    INSTANCE = new PaymentFacade();
                }
            }
        }
        return INSTANCE;
    }


    @Override
    public void pay(String amount) {
        // 使用工厂获取对象
        PaymentFactory.getGatewayService(amount).pay(amount);
    }
}

5、编写测试类

java 复制代码
/**
 * 测试外观模式
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/07
 */
public class FacadeTest {
    @Test
    public void testFacade() {
        PaymentFacade.getInstance().pay("100");
        PaymentFacade.getInstance().pay("100000");
    }
}

3、测试结果

通过微信支付:100

通过支付宝支付:100000

实现要点

  1. 定义一个外观类,在其中引入子系统的具体实现类的对象,并提供统一的接口供客户端调用。

总结

外观模式,也被称为门面模式,是一种对象结构型模式。他为多个复杂的子系统提供一个统一的接口,使得这些子系统更加容易被访问。

单纯使用外观模式很简单,我们可以考虑结合其他模式一起开发。比如文中就将外观类定义成了单例类,并在其中使用工厂模式获取子系统的实例对象,其实这些模式的使用都是顺其自然的,没有什么强制性。

相关推荐
IT_陈寒31 分钟前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
青山木1 小时前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划
朝朝辞暮i1 小时前
C++ 第 26 课:对象、指针与 ->
java·开发语言·c++
长弓三石1 小时前
把 AgentScope Harness 装进 RuoYi-Vue-Plus:纯 Java AI 平台的集成实践
java·人工智能·agent
要努力啊4691 小时前
用 Codex 加速 Java 开发:从代码生成到测试覆盖的完整实战
后端
dora1 小时前
LangChain4j 新手入门实战教程(Java版)
后端·langchain·agent
蜗牛互联网1 小时前
MongoDB Atlas Agent Engine之后,如何用版本门禁防止陈旧写入
java·数据库·人工智能·后端·mongodb
长弓三石1 小时前
企业级智能体的权限到底怎么落地?以 BizBuddy 为例
java·人工智能·agent
付威20231 小时前
Rust 生命周期:为什么要有它,实际代码里到底怎么用?
后端
海岳云舟1 小时前
spring使用kafka的三种方式(listener、container、stream)
后端