65.9K
CodeProject 正在变化。 阅读更多。
Home

外观

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.55/5 (5投票s)

2008年2月23日

CPOL

1分钟阅读

viewsIcon

14166

外观模式外观模式提供了一个简单的接口,并控制对一系列复杂接口和/或子系统的访问。其中一些

引言

外观模式提供了一个简单的接口,并控制对一系列复杂接口和/或子系统的访问。

外观模式的一些重要特性和优点是

  • 外观模式可以使软件库更易于使用和理解,因为外观模式为常见任务提供了便捷的方法。
  • 外观模式可以使使用该库的代码更具可读性,原因相同。
  • 外观模式可以减少外部代码对库内部运作的依赖,因为大多数代码使用外观模式,从而允许在系统开发中拥有更大的灵活性。
  • 外观模式可以用一个设计良好的 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 图

Facade Design Pattern

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

文章

© . All rights reserved.