概述
外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。通过在外观类中定义一个高层接口,外观模式隐藏了子系统的复杂性,并将客户端与子系统的内部逻辑解耦。
优点:
- 简化了客户端与子系统之间的交互,降低了客户端与子系统的耦合度。
- 提供了一个简单的接口,使得子系统更易于使用。
- 隔离了客户端和子系统之间的细节,使得子系统的具体实现可以独立变化。
缺点:
- 如果需要修改子系统的行为,可能需要修改外观类的代码。
- 外观类可能会变得庞大,包含了很多与子系统相关的方法。这可能违反了单一职责原则。
适用场景:
- 当你需要为一个复杂的子系统提供一个简单的接口时,可以使用外观模式。例如,你可以使用外观模式来封装一个复杂的第三方库或者服务。
- 当你希望客户端与子系统之间解耦,以降低它们的依赖关系时,可以使用外观模式。
- 当子系统的接口频繁变化,或者有多个接口实现时,可以使用外观模式来统一客户端的调用。
示例
一个常见的实际应用场景是购物平台。假设你正在开发一个电子商务平台,需要提供一个统一的购物接口,包括添加商品到购物车、生成订单、支付等操作。你可以使用外观模式来封装底层的购物逻辑,以提供一个简单的购物接口给客户端使用。
以下是一个示例代码:
class ShoppingCart {public void addProduct(String productId) {System.out.println("添加商品到购物车:" + productId);}public void generateOrder() {System.out.println("生成订单");}public void payOrder(String orderId) {System.out.println("支付订单:" + orderId);}
}class ShoppingFacade {private ShoppingCart shoppingCart;public ShoppingFacade() {this.shoppingCart = new ShoppingCart();}public void addToCart(String productId) {shoppingCart.addProduct(productId);}public void checkout() {shoppingCart.generateOrder();}public void pay(String orderId) {shoppingCart.payOrder(orderId);}
}public class Main {public static void main(String[] args) {ShoppingFacade shoppingFacade = new ShoppingFacade();shoppingFacade.addToCart("P001");shoppingFacade.addToCart("P002");shoppingFacade.checkout();shoppingFacade.pay("O001");}
}
输出结果:
添加商品到购物车:P001
添加商品到购物车:P002
生成订单
支付订单:O001