外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一群接口,从而隐藏了系统的复杂性。外观模式的目的是定义高层级接口,让子系统更容易使用,目的是隐藏系统的复杂性。多个子系统联合完成一个操作,提供一个统一的接口,供客户端调用,客户端不与每个子系统进行复杂的交互,客户端只与提供接口的外观类进行交互 。,,外观模式的特点有:1. 隐藏复杂性;2. 提供一个统一的接口;3. 降低耦合度;4. 使系统更加易于维护 。
在编程中,我们经常会遇到这样的问题:一个对象的行为取决于它的属性,一个人的年龄可能影响他的职业选择,而一个汽车的速度可能影响它的油耗,这种依赖关系使得代码难以维护和扩展,为了解决这个问题,我们可以使用设计模式,本文将介绍一种设计模式——外观模式,它可以帮助我们简化类和接口之间的依赖关系,提高代码的可读性和可维护性。
外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用,外观模式的主要目的是隐藏子系统的复杂性,提供一个简单易用的接口给用户。
外观模式的主要角色有以下几个:
1、外观(Facade):外观是一个高层接口,它为子系统中的一组接口提供统一的访问方式,外观类通常是一个单例模式的实现,以确保在整个应用程序中只有一个实例。
2、子系统(Subsystem):子系统是实际执行任务的组件,它们遵循一定的规范来实现特定的功能,子系统可以是一个类、一个模块或者一个库。
3、客户端(Client):客户端是使用外观类的用户,它们不需要了解子系统的内部实现,只需要通过外观类来调用子系统的接口即可。
下面我们通过一个具体的例子来说明外观模式的使用,假设我们有一个在线购物系统,其中包含了多个子系统,如商品管理、订单管理、支付管理等,这些子系统之间存在一定的依赖关系,例如订单管理需要依赖商品管理和支付管理,为了简化客户端与这些子系统之间的交互,我们可以使用外观模式。
我们定义一个外观类ShoppingFacade
,它包含了一系列子系统的引用:
public class ShoppingFacade { private ProductManager productManager; private OrderManager orderManager; private PaymentManager paymentManager; public ShoppingFacade() { productManager = new ProductManager(); orderManager = new OrderManager(); paymentManager = new PaymentManager(); } public void addProduct(String name, double price) { productManager.addProduct(name, price); } public void createOrder(double totalPrice) { orderManager.createOrder(totalPrice); } public void pay(double amount) { paymentManager.pay(amount); } }
我们定义各个子系统类:
public class ProductManager { public void addProduct(String name, double price) { // 实现添加商品的功能 } } public class OrderManager { public void createOrder(double totalPrice) { // 实现创建订单的功能,需要调用商品管理和支付管理的接口 } } public class PaymentManager { public void pay(double amount) { // 实现支付的功能,需要调用商品管理和订单管理的接口 } }
我们在客户端代码中使用ShoppingFacade
类来完成购物流程:
public class Client { public static void main(String[] args) { ShoppingFacade shoppingFacade = new ShoppingFacade(); shoppingFacade.addProduct("iPhone", 5999); shoppingFacade.addProduct("MacBook", 13999); shoppingFacade.createOrder(5999 + 13999); // 一个订单包括一台iPhone和一台MacBook shoppingFacade.pay(5999 + 13999); // 为这个订单支付相应的金额 } }
通过使用外观模式,我们将客户端与子系统之间的复杂关系隐藏起来,使得客户端只需要关注外观类提供的简单接口,当子系统中的某个功能发生变化时,我们只需要修改外观类和相应的子系统类,而无需修改客户端代码,这样可以大大提高代码的可维护性和可扩展性。