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

总结

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

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

相关推荐
苹果醋322 分钟前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
Hello.Reader42 分钟前
深入解析 Apache APISIX
java·apache
盛派网络小助手1 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
菠萝蚊鸭1 小时前
Dhatim FastExcel 读写 Excel 文件
java·excel·fastexcel
旭东怪1 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
007php0071 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
∝请叫*我简单先生1 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
ssr——ssss2 小时前
SSM-期末项目 - 基于SSM的宠物信息管理系统
java·ssm
一棵星2 小时前
Java模拟Mqtt客户端连接Mqtt Broker
java·开发语言
鲤籽鲲2 小时前
C# Random 随机数 全面解析
android·java·c#