在上一篇文章中,我们描述了适配器设计模式 。 在今天的文章中,我们将展示另一种类似的“四结构帮派”模式 。 顾名思义,结构模式用于从许多不同的对象形成更大的对象结构。 外观模式就是这样一种模式,它为系统内的一组接口提供了简化的接口,因此对客户端隐藏了子系统的复杂性。
何时使用外墙图案?
分层:外观模式可以在JEE应用程序中用于创建一个层,以抽象和统一应用程序中的相关接口。 使用外观将为每个子系统级别定义一个入口点,从而使它们只能通过其外观进行通信。 这样可以简化它们之间的依赖关系。
Façade使API和库更易于使用,有利于维护和可读性。 它还可以使用单个简化的API整理和抽象各种设计不当的API。
它还减少了外部代码对库内部工作的依赖性,从而提供了灵活性。
在上述Façade模式的结构中,Façade类将子系统与客户端隔离。 客户端仅与Façade类进行交互,而无需了解子系统类。
例:
让我们以在线订单处理网站为例。 客户在不了解内部类如何工作的情况下下了订单。 下订单后,外观类层将调用子系统的方法(例如,用于库存检查的“库存”和用于处理付款的“付款”)。 处理后,它将控制返回给客户端类,并带有关于正在处理的订单的确认。
顺序图:
代码示例:
Inventory.java –
public class Inventory {public String checkInventory(String OrderId) {return 'Inventory checked';}
}
Payment.java
public class Payment {public String deductPayment(String orderID) {return 'Payment deducted successfully';}
}
OrderFacade.java
public class OrderFacade {private Payment pymt = new Payment();private Inventory inventry = new Inventory();public void placeOrder(String orderId) {String step1 = inventry.checkInventory(orderId);String step2 = pymt.deductPayment(orderId);System.out.println('Following steps completed:' + step1 + ' & ' + step2);}
}
客户端程序
public class Client {public static void main(String args[]){OrderFacade orderFacade = new OrderFacade();orderFacade.placeOrder('OR123456');System.out.println('Order processing completed');}
}
优点:
- 我们可以使用façade模式来整理所有复杂的方法调用和相关的代码块,并将其通过一个单独的Façade类进行通道化。 这样,对于客户而言,只有一个呼叫。 即使我们更改了子系统包/类及其逻辑,也不会影响客户端调用。 简而言之,这增加了松散的耦合。
- 它使创建和使用更加结构化的环境变得更加容易使用和维护,并减少了库或其他软件包之间的依赖性。
缺点/后果:
- 缺点之一是子系统方法连接到Façade层。 如果子系统的结构发生变化,则需要随后对Façade层和客户端方法进行更改。
有趣的一点:
外墙样式可能与调解人样式混淆。 中介器还以类似于外观的方式抽象了子系统的功能。 但是,这两种模式之间存在细微的差异。 在中介程序模式的情况下,子系统知道中介程序,但是在立面的情况下,子系统对立面一无所知。 这是从Façade到子系统的一种单向通信。
Java API中使用的外观
- javax.servlet.http.HttpSession
- javax.servlet.http.HttpServletRequest
- javax.servlet.http.HttpServletResponse
- javax.faces.context.ExternalContext
参考:立面 设计模式–来自我们的JCG合作伙伴 Mainak Goswami在Idiotechie博客上的设计观点 。
翻译自: https://www.javacodegeeks.com/2012/11/facade-design-pattern-design-standpoint.html