• Java设计模式之门面模式(Facade Pattern)


    门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。门面模式通过创建一个高层接口,简化了客户端与子系统之间的交互,从而降低了系统的复杂性。

    在门面模式中,门面(Facade)是一个包含了子系统中各个接口的高层接口。它将客户端的请求委派给相应的子系统对象,起到了一个中介的作用。客户端只需要与门面进行交互,而不需要直接与子系统的各个对象进行通信。

    门面模式的主要优点如下:

    1. 简化了客户端与子系统之间的交互,客户端只需要与门面进行通信,不需要了解子系统的复杂性。
    2. 提高了系统的灵活性和可扩展性,因为门面屏蔽了子系统的实现细节,可以方便地对子系统进行修改和扩展。
    3. 降低了客户端与子系统之间的耦合度,客户端只依赖于门面接口,不依赖于子系统的具体实现。

    下面是一个示例,以购物网站的订单处理为例来说明门面模式的应用:

    // 子系统类:库存管理
    class InventoryManager {
        public boolean checkStock(String productId, int quantity) {
            // 检查库存是否足够
            // 省略具体实现
            return true;
        }
    }
    
    // 子系统类:支付服务
    class PaymentService {
        public boolean makePayment(String paymentMethod, double amount) {
            // 进行支付操作
            // 省略具体实现
            return true;
        }
    }
    
    // 子系统类:物流服务
    class ShippingService {
        public String shipOrder(String orderId) {
            // 进行物流操作
            // 省略具体实现
            return "1234567890"; // 返回物流单号
        }
    }
    
    // 门面类:订单处理门面
    class OrderFacade {
        private InventoryManager inventoryManager;
        private PaymentService paymentService;
        private ShippingService shippingService;
    
        public OrderFacade() {
            this.inventoryManager = new InventoryManager();
            this.paymentService = new PaymentService();
            this.shippingService = new ShippingService();
        }
    
        public boolean processOrder(String productId, int quantity, String paymentMethod) {
            boolean stockAvailable = inventoryManager.checkStock(productId, quantity);
            if (!stockAvailable) {
                System.out.println("库存不足");
                return false;
            }
    
            double totalPrice = calculateTotalPrice(productId, quantity);
            boolean paymentSuccess = paymentService.makePayment(paymentMethod, totalPrice);
            if (!paymentSuccess) {
                System.out.println("支付失败");
                return false;
            }
    
            String orderId = generateOrderId();
            String trackingNumber = shippingService.shipOrder(orderId);
            System.out.println("订单处理完成,物流单号:" + trackingNumber);
            return true;
        }
    
        private double calculateTotalPrice(String productId, int quantity) {
            // 根据商品ID和数量计算总价
            // 省略具体实现
            return 100.0;
        }
    
        private String generateOrderId() {
            // 生成订单号
            // 省略具体实现
            return "ORD123456";
        }
    }
    
    // 客户端代码
    public class Client {
        public static void main(String[] args) {
            OrderFacade orderFacade = new OrderFacade();
            boolean success = orderFacade.processOrder("12345", 2, "creditcard");
            if (success) {
                System.out.println("订单处理成功");
            } else {
                System.out.println("订单处理失败");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    在上述示例中,OrderFacade是门面类,它封装了库存管理、支付服务和物流服务等子系统的接口。客户端只需要与OrderFacade进行交互,调用processOrder方法来处理订单,无需直接与子系统的类进行交互。OrderFacade内部根据订单处理的流程依次调用子系统的接口,完成订单的处理过程。通过使用门面模式,客户端代码与子系统之间的耦合度降低,同时提供了一个简单的接口来处理订单,隐藏了子系统的复杂性。

  • 相关阅读:
    echarts 饼图 环形图 lable添加下划线
    【JavaWeb】案例:读取 WEB 工程下的资源文件、文件下载、点击切换验证码
    Mybatis的mapper接口实现原理
    python opencv识别蓝牌车牌号 之 取出车牌号 (1/3)
    华为数通方向HCIP-DataCom H12-821题库(单选题:241-260)
    uniapp微信小程序 提示消息 上传文件
    JDK8中HashMap底层源码解析-resize方法
    【测试】1. 概念 + 基础篇
    Java项目:SSM网上超市购物商城管理系统
    Find My护照|苹果Find My技术与护照结合,智能防丢,全球定位
  • 原文地址:https://blog.csdn.net/kkwyting/article/details/133945654