设计模式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. 定义一个外观类,在其中引入子系统的具体实现类的对象,并提供统一的接口供客户端调用。

总结

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

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

相关推荐
货拉拉技术11 小时前
资损下降 99.96% 的背后: AI 资损防控平台实战
后端
用户83580861879111 小时前
撮合引擎 OrderBook 的 100ns 之路:无锁 RingBuffer + 伪共享消除,Go 1.22 下单 op 11ns
后端
用户8818630013611 小时前
用Node.js写一个简单的API请求日志中间件
后端
用户83580861879111 小时前
Go 高并发下的“内存刺客“:自研 Size-Class 无锁对象池,把 sync.Pool 的 P99 从 128μs 压到 41μs
后端
货拉拉技术12 小时前
资损下降 99.96% 的背后— AI 资损防控平台实战
后端
山水洛行14 小时前
AI Agent 智能体记忆:从检索到被治理的数据系统
后端
卷无止境14 小时前
C++20 的概念与约束:让模板编程终于"说人话"
后端
Ai拆代码的曹操14 小时前
一次排查三种连接泄漏模式,再也不怕 HikariCP 连接池爆满了
后端
人活一口气14 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
咪库咪库咪14 小时前
Cypher入门
后端