个人主页:金鳞踏雨
个人简介:大家好,我是星辰,一个初出茅庐的Java小白
目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作
我的博客:这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进步 ~
Facade模式,又叫外观模式。它属于结构型设计模式的一种。Facade模式旨在为复杂的子系统提供一个简化的接口,从而隐藏系统的复杂性,使客户端能够更方便地使用系统。
在软件开发中,大型系统通常由多个子系统组成,每个子系统都有自己的一组接口和功能。这些子系统之间的交互可能会变得非常复杂,对于客户端来说,直接与这些子系统进行交互可能会变得困难和繁琐。
Facade模式通过引入一个外观类(Facade class)来解决这个问题。外观类提供了一个高层次的接口,将客户端与子系统的复杂性隔离开来。客户端只需要与外观类进行交互,而不需要直接与子系统的组件进行交互。
外观模式(Facade模式)可以视为面向对象中封装的一种应用。给外界提供清晰明了的使用方式,不用关心内部的复杂逻辑。
外观模式(Facade Pattern)涉及以下角色:
外观(Facade):外观类是外部与子系统之间的接口,它封装了子系统的复杂性,为客户端提供了一个简化的接口。外观类知道哪些子系统类负责处理请求,将客户端的请求转发给适当的子系统对象。
子系统(Subsystems):子系统是实现实际功能的类或组件。它们处理外观类转发的请求。子系统类可以是单个类或一组相关的类。
客户端(Client):客户端通过外观类来与子系统进行交互。它不直接与子系统类交互,而是通过外观类提供的简化接口来完成操作。
比较简单,说白了就是封装~
假设我们有一个电商平台,客户可以下单购买产品。在这个场景中,我们有三个子系统组件:库存管理、支付系统和物流系统
/**
* 子系统组件:库存管理
*/
public class InventoryManager {
public void updateQuantity(String productId, int quantity) {
System.out.println("更新产品库存:productId=" + productId + ", quantity=" + quantity);
}
}
/**
* 子系统组件:支付系统
*/
public class PaymentProcessor {
public void processPayment(String paymentMethod, double amount) {
System.out.println("支付金额:" + amount + ",支付方式:" + paymentMethod);
}
}
/**
* 子系统组件:物流系统
*/
public class ShippingManager {
public void shipOrder(String orderId) {
System.out.println("发货:orderId=" + orderId);
}
}
/**
* 外观类:订单处理外观
*/
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
订单处理完成
多个接口的复杂子系统:假设你正在开发一个图形处理应用程序,它包含了许多不同的图形操作,比如绘制图形、填充颜色、应用滤镜等。每个图形操作都有自己的接口和实现类。使用外观模式,你可以创建一个名为"图形处理外观"的类,它提供一个简单的接口来调用各种图形操作,客户端只需与这个外观类进行交互,而不需要直接与每个图形操作的接口和实现类打交道。
服务接口的统一封装:假设你正在开发一个电子商务网站,该网站需要与多个第三方支付服务进行交互,比如支付宝、微信支付、银联支付等。每个支付服务都有自己的接口和调用方式。通过使用外观模式,你可以创建一个名为"支付服务外观"的类,它封装了与各个支付服务的交互细节,并提供一个统一的支付接口给客户端使用。
简化复杂库的使用:假设你使用一个强大但复杂的第三方库来处理图像处理任务,该库提供了许多复杂的类和方法。为了简化使用,你可以创建一个外观类,封装库的复杂性,并提供一个更简单、易于使用的接口给你的应用程序。这样,你的应用程序只需与外观类进行交互,而无需了解库的底层实现细节。
总的来说,外观模式适用于需要简化复杂子系统、提供简单接口、解耦客户端和子系统、构建层次结构系统等情况。它可以帮助提高代码的可维护性、降低客户端和子系统之间的耦合度,并提供一个更简单、易于使用的接口给客户端使用。
文章到这里就结束了,如果有什么疑问的地方,可以在评论区指出~
希望能和大佬们一起努力,诸君顶峰相见
再次感谢各位小伙伴儿们的支持!!!