Design Patterns(十一):Facade Pattern--VB代码

本文介绍了Facade设计模式的概念及其在软件架构中的应用。通过简化复杂的子系统接口,Facade模式为客户端提供了统一且简单的高级接口,实现了解耦和易于使用的双重目标。

结构图

 

角色

  • 门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
  • 子系统(subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

动机

  如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化的内部子系统的变化之间的依赖相互解耦?

意图

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

示意性代码

示意性代码
'Facade pattern -- Real World example

'MainApp test application
Public Class MainAppClass MainApp
    
Public Sub Main()Sub Main()
        
Dim facade As New Facade

        facade.MethodA()
        facade.MethodB()

        
'Wait for user 
        Console.ReadLine()
    
End Sub

End Class


'"Subsystem ClassA" 
Public Class SubsystemOneClass SubsystemOne
    
Public Sub MethodOne()Sub MethodOne()
        Console.WriteLine(
"SubsystemOne Method")
    
End Sub

End Class


'Subsystem ClassB"
Public Class SubsystemTwoClass SubsystemTwo
    
Public Sub MethodTwo()Sub MethodTwo()
        Console.WriteLine(
"SubsystemTwo Method")
    
End Sub

End Class


'Subsystem ClassC" 
Public Class SubsystemThreeClass SubsystemThree
    
Public Sub MethodThree()Sub MethodThree()
        Console.WriteLine(
"SubsystemThree Method")
    
End Sub

End Class


'Subsystem ClassD"
Public Class SubsystemFourClass SubsystemFour
    
Public Sub MethodFour()Sub MethodFour()
        Console.WriteLine(
"SubsystemFour Method")
    
End Sub

End Class


'"Facade"
Public Class FacadeClass Facade
    
Private one As SubsystemOne
    
Private two As SubsystemTwo
    
Private three As SubsystemThree
    
Private four As SubsystemFour

    
Public Sub New()Sub New()
        one 
= New SubsystemOne
        two 
= New SubsystemTwo
        three 
= New SubsystemThree
        four 
= New SubsystemFour
    
End Sub


    
'提供给客户程序的简单接口
    Public Sub MethodA()Sub MethodA()
        Console.WriteLine()
        Console.WriteLine(
"MethodA() ---- ")
        one.MethodOne()
        two.MethodTwo()
        four.MethodFour()
    
End Sub


    
'提供给客户程序的简单接口
    Public Sub MethodB()Sub MethodB()
        Console.WriteLine()
        Console.WriteLine(
"MethodB() ---- ")
        two.MethodTwo()
        three.MethodThree()
    
End Sub

End Class

一个实例

实例代码
 ' Facade pattern -- Real World example

 
Imports System

 
Namespace DoFactoryNamespace DoFactory.GangOfFour.Facade.RealWorld
     
' MainApp test application
    
     
Class MainAppClass MainApp
         
Private Shared Sub Main()Sub Main()
             
' Facade
             Dim mortgage As New Mortgage()
            
             
' Evaluate mortgage eligibility for customer
             Dim customer As New Customer("Ann McKinsey")
             
Dim eligable As Boolean = mortgage.IsEligible(customer, 125000)
            
             Console.WriteLine(
"" & Chr(10& "" + customer.Name + " has been " + (IIf(eligable,"Approved","Rejected")))
            
             
' Wait for user
             Console.Read()
         
End Sub

     
End Class

    
     
' "Subsystem ClassA"
    
     
Class BankClass Bank
         
Public Function HasSufficientSavings()Function HasSufficientSavings(ByVal c As Customer, ByVal amount As IntegerAs Boolean
             Console.WriteLine(
"Check bank for " + c.Name)
             
Return True
         
End Function

     
End Class

    
     
' "Subsystem ClassB"
    
     
Class CreditClass Credit
         
Public Function HasGoodCredit()Function HasGoodCredit(ByVal c As Customer) As Boolean
             Console.WriteLine(
"Check credit for " + c.Name)
             
Return True
         
End Function

     
End Class

    
     
' "Subsystem ClassC"
    
     
Class LoanClass Loan
         
Public Function HasNoBadLoans()Function HasNoBadLoans(ByVal c As Customer) As Boolean
             Console.WriteLine(
"Check loans for " + c.Name)
             
Return True
         
End Function

     
End Class

    
     
Class CustomerClass Customer
         
Private m_name As String
        
         
' Constructor
         Public Sub New()Sub New(ByVal name As String)
             
Me.m_name = name
         
End Sub

        
         
' Property
         Public ReadOnly Property Name()Property Name() As String
             
Get
                 
Return m_name
             
End Get
         
End Property

     
End Class

    
     
' "Facade"
    
     
Class MortgageClass Mortgage
         
Private bank As New Bank()
         
Private loan As New Loan()
         
Private credit As New Credit()
        
         
Public Function IsEligible()Function IsEligible(ByVal cust As Customer, ByVal amount As IntegerAs Boolean
             Console.WriteLine(
"{0} applies for {1:C} loan" & Chr(10& "", cust.Name, amount)
            
             
Dim eligible As Boolean = True
            
             
' Check creditworthyness of applicant
             If Not bank.HasSufficientSavings(cust, amount) Then
                 eligible 
= False
            
ElseIf Not loan.HasNoBadLoans(cust) Then
                 eligible 
= False
            
ElseIf Not credit.HasGoodCredit(cust) Then
                 eligible 
= False
             
End If
            
             
Return eligible
         
End Function

     
End Class

 
End Namespace



Facade模式的几个要点:
  1、从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果--内部子系统的任何变化不会影响到Facade接口的变化。
  2、Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
   3、注意区分Facade模式、Adapter模式、Bridge模式与Decorator模式。Facade模式注重简化接口,Adapter模式注 重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

我的理解
        子系统和外界通信的中间层。

参考资料
《C#设计模式(15)-Fracade Pattern》 吕震宇
《C#面向对象设计模式纵横谈系列课程(11)》 李建中老师

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值