外观






4.55/5 (5投票s)
外观模式外观模式提供了一个简单的接口,并控制对一系列复杂接口和/或子系统的访问。其中一些
引言
外观模式提供了一个简单的接口,并控制对一系列复杂接口和/或子系统的访问。
外观模式的一些重要特性和优点是
- 外观模式可以使软件库更易于使用和理解,因为外观模式为常见任务提供了便捷的方法。
- 外观模式可以使使用该库的代码更具可读性,原因相同。
- 外观模式可以减少外部代码对库内部运作的依赖,因为大多数代码使用外观模式,从而允许在系统开发中拥有更大的灵活性。
- 外观模式可以用一个设计良好的 API 来封装一个设计不良的 API 集合。
在下面的示例中,使用 OrderFacade
的开发人员不需要理解创建正确的 Order
类所需的所有要求。这些细节隐藏在外观模式之后。
VB 和 C# 的外观模式示例
' Code within the application which uses the
' simple interface that the Order Facade exposes to
' place an order
Dim anOrderFacade As New OrderFacade
Dim aOrderID As Integer = anOrderFacade.placeOrder(234324324, myBasketItems)
' The Order Facade
Public Class OrderFacade
' Places an Order and Returns an Order ID
Public Function placeOrder(ByVal CustomerID As Integer, ByVal products As List(Of basketItems)) As Integer
Dim anOrder As New Order
Dim anOrderLine As New OrderLine
Dim despatchAddress As Address = Address.getCustomerDespatchAddress(CustomerID)
Dim orderID As Integer = anOrder.requestOrderID
anOrder.createOrder(orderID, despatchAddress)
anOrderLine.addOrderLinesToOrder(orderID, products)
Return orderID
End Function
End Class
' Order Class
Public Class Order
Public Function requestOrderID() As Integer
' Creates and Returns a Unique Order ID
End Function
Public Sub createOrder(ByVal OrderID As Integer, ByVal despatchAddress As Address)
End Sub
End Class
' OrderLine Class
Public Class OrderLine
Public Sub addOrderLinesToOrder(ByVal OrderID As Integer, ByVal Products As List(Of basketItems))
End Sub
End Class
' Public Customer
Public Class Address
Public Shared Function getCustomerDespatchAddress(ByVal CustomerID As Integer) As Address
End Function
' Address Properties...
End Class
using System;
using System.Collections.Generic;
namespace Yanesh.DesignPatterns.Facade
{
public class OrderFacade
{
//Places an Order and Returns an Order ID
public int placeOrder(int CustomerID, List<BasketItem> Products)
{
Order anOrder = new Order();
OrderLine anOrderLine = new OrderLine();
Address DespatchAddress = Address.getCustomerDespatchAddress(CustomerID);
int OrderId = anOrder.requestOrderID();
anOrder.createOrder(OrderId, DespatchAddress);
anOrderLine.addOrderLinesToOrder(OrderId, Products);
return OrderId;
}
}
//order class
public class Order
{
public int requestOrderID()
{
//Creates and Returns a Unique Order ID
}
public void createOrder(int OrderId, Address DespatchAddress)
{
}
}
//OrderLine Class
public class OrderLine
{
public void addOrderLinesToOrder(int OrderId, List<BasketItem> Products)
{
}
}
//Public Customer
public class Address
{
public static Address getCustomerDespatchAddress(int CustomerID)
{
return new Address();
}
//Address properties
}
public class BasketItem
{
//BasketItem Properties
}
}
UML 图

然而,对于巨大的子系统,外观模式本身也可能变得过于复杂。 此外,在外观模式之上拥有一个抽象的外观模式也是一个好主意。
最常见和最成功的例子之一是通过 Web 服务使用此模式,使 Web 服务充当外观模式或对许多不同 DLL 的接口,每个 DLL 代表一个子系统。