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

总结

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

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

相关推荐
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
码农小旋风3 小时前
详解K8S--声明式API
后端
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7894 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet