【23种设计模式】外观模式(Facade Pattern)

个人主页:金鳞踏雨

个人简介:大家好,我是星辰,一个初出茅庐的Java小白

目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作

我的博客:这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进步 ~

外观模式概念

【23种设计模式】外观模式(Facade Pattern)_第1张图片

Facade模式,又叫外观模式。它属于结构型设计模式的一种。Facade模式旨在为复杂的子系统提供一个简化的接口,从而隐藏系统的复杂性,使客户端能够更方便地使用系统。

在软件开发中,大型系统通常由多个子系统组成,每个子系统都有自己的一组接口和功能。这些子系统之间的交互可能会变得非常复杂,对于客户端来说,直接与这些子系统进行交互可能会变得困难和繁琐。

Facade模式通过引入一个外观类(Facade class)来解决这个问题。外观类提供了一个高层次的接口,将客户端与子系统的复杂性隔离开来。客户端只需要与外观类进行交互,而不需要直接与子系统的组件进行交互。

外观模式(Facade模式)可以视为面向对象中封装的一种应用。给外界提供清晰明了的使用方式,不用关心内部的复杂逻辑。

外观模式角色

外观模式(Facade Pattern)涉及以下角色:

  1. 外观(Facade):外观类是外部与子系统之间的接口,它封装了子系统的复杂性,为客户端提供了一个简化的接口。外观类知道哪些子系统类负责处理请求,将客户端的请求转发给适当的子系统对象。

  2. 子系统(Subsystems):子系统是实现实际功能的类或组件。它们处理外观类转发的请求。子系统类可以是单个类或一组相关的类。

  3. 客户端(Client):客户端通过外观类来与子系统进行交互。它不直接与子系统类交互,而是通过外观类提供的简化接口来完成操作。

比较简单,说白了就是封装~

外观模式代码实现

案例需求

假设我们有一个电商平台,客户可以下单购买产品。在这个场景中,我们有三个子系统组件:库存管理、支付系统和物流系统

  • 库存管理(InventoryManager)负责更新产品库存。当有订单生成时,库存管理会更新相应产品的库存数量。
  • 支付系统(PaymentProcessor)负责处理支付。当客户选择支付方式并提交订单时,支付系统会进行金额验证和支付处理。
  • 物流系统(ShippingManager)负责发货。一旦订单支付成功,物流系统会根据订单信息进行发货操作。

3个子系统

库存管理 - InventoryManager 

/**
 * 子系统组件:库存管理
 */
public class InventoryManager {
    public void updateQuantity(String productId, int quantity) {
        System.out.println("更新产品库存:productId=" + productId + ", quantity=" + quantity);
    }
}

支付系统 - PaymentProcessor 

/**
 * 子系统组件:支付系统
 */
public class PaymentProcessor {
    public void processPayment(String paymentMethod, double amount) {
        System.out.println("支付金额:" + amount + ",支付方式:" + paymentMethod);
    }
}

物流系统 - ShippingManager 

/**
 * 子系统组件:物流系统
 */
public class ShippingManager {
    public void shipOrder(String orderId) {
        System.out.println("发货:orderId=" + orderId);
    }
}

 外观类-OrderFacade 

/**
 * 外观类:订单处理外观
 */
public class OrderFacade {
    private InventoryManager inventoryManager;
    private PaymentProcessor paymentProcessor;
    private ShippingManager shippingManager;

    public OrderFacade() {
        inventoryManager = new InventoryManager();
        paymentProcessor = new PaymentProcessor();
        shippingManager = new ShippingManager();
    }

    /**
     * 处理订单 - Order
     * @param productId
     * @param quantity
     * @param paymentMethod
     */
    public void processOrder(String productId, int quantity, String paymentMethod) {
        // 检查库存
        inventoryManager.updateQuantity(productId, -quantity);

        // 处理支付
        double amount = calculateTotalPrice(productId, quantity);
        paymentProcessor.processPayment(paymentMethod, amount);

        // 发货
        String orderId = generateOrderId();
        shippingManager.shipOrder(orderId);

        System.out.println("订单处理完成");
    }

    /**
     * 价格计算
     * @param productId
     * @param quantity
     * @return
     */
    private double calculateTotalPrice(String productId, int quantity) {
        // 根据产品ID和数量计算总价,这里简化为固定价格
        double price = 10.0;
        return price * quantity;
    }

    /**
     * 生成订单ID
     * @return
     */
    private String generateOrderId() {
        // 生成订单ID,这里简化为随机字符串
        return "ORD" + Math.round(Math.random() * 1000);
    }
}

客户端(外部调用)

/**
 * 客户端代码
 */
public class Client {
    public static void main(String[] args) {
        OrderFacade orderFacade = new OrderFacade();

        // 处理订单
        String productId = "P001";
        int quantity = 5;
        String paymentMethod = "Credit Card";
        orderFacade.processOrder(productId, quantity, paymentMethod);
    }
}

运行结果

更新产品库存:productId=P001, quantity=-5
支付金额:50.0,支付方式:Credit Card
发货:orderId=ORD114
订单处理完成

外观模式使用场景

  1. 多个接口的复杂子系统:假设你正在开发一个图形处理应用程序,它包含了许多不同的图形操作,比如绘制图形、填充颜色、应用滤镜等。每个图形操作都有自己的接口和实现类。使用外观模式,你可以创建一个名为"图形处理外观"的类,它提供一个简单的接口来调用各种图形操作,客户端只需与这个外观类进行交互,而不需要直接与每个图形操作的接口和实现类打交道。

  2. 服务接口的统一封装:假设你正在开发一个电子商务网站,该网站需要与多个第三方支付服务进行交互,比如支付宝、微信支付、银联支付等。每个支付服务都有自己的接口和调用方式。通过使用外观模式,你可以创建一个名为"支付服务外观"的类,它封装了与各个支付服务的交互细节,并提供一个统一的支付接口给客户端使用。

  3. 简化复杂库的使用:假设你使用一个强大但复杂的第三方库来处理图像处理任务,该库提供了许多复杂的类和方法。为了简化使用,你可以创建一个外观类,封装库的复杂性并提供一个更简单、易于使用的接口给你的应用程序。这样,你的应用程序只需与外观类进行交互,而无需了解库的底层实现细节。

总的来说,外观模式适用于需要简化复杂子系统提供简单接口、解耦客户端和子系统、构建层次结构系统等情况。它可以帮助提高代码的可维护性、降低客户端和子系统之间的耦合度,并提供一个更简单、易于使用的接口给客户端使用。

文章到这里就结束了,如果有什么疑问的地方,可以在评论区指出~

希望能和大佬们一起努力,诸君顶峰相见

再次感谢各位小伙伴儿们的支持!!!

你可能感兴趣的:(23种设计模式,设计模式,外观模式,状态模式,java,facade)