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

总结

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

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

相关推荐
李广坤6 分钟前
JAVA线程池详解
后端
调试人生的显微镜13 分钟前
深入剖析 iOS 26 系统流畅度,多工具协同监控与性能优化实践
后端
蹦跑的蜗牛14 分钟前
Spring Boot使用Redis实现消息队列
spring boot·redis·后端
非凡ghost23 分钟前
HWiNFO(专业系统信息检测工具)
前端·javascript·后端
非凡ghost25 分钟前
FireAlpaca(免费数字绘图软件)
前端·javascript·后端
ekkcole26 分钟前
java把word转pdf使用jar包maven依赖
java·pdf·word
非凡ghost31 分钟前
Sucrose Wallpaper Engine(动态壁纸管理工具)
前端·javascript·后端
Java小王子呀34 分钟前
Java实现Excel转PDF
java·pdf·excel
间彧35 分钟前
从零到一搭建Spring Cloud Alibbaba项目
后端
楼田莉子36 分钟前
C++学习:C++11关于类型的处理
开发语言·c++·后端·学习