设计模式与VB .net实现 适配器模式

         这是看Design Patterns in C#同步的心得记录.里头记录了VB的实现代码,还有一些感性认识,另外,忽略一些C#的特性和不太相关的东西.
        这本书买了有两年了,开始时看不懂.直到近来才有所体会.

第一部分 接口型模式

简介

        接口型模式,通俗的说就是使用一种约定好的接口,来完成两个类之间的调用.先不管这中约定是为什么而来.
        接口为什么而来的问题,将会对应产生不同的接口型模式.
        接口和抽象类的区别,我认为最本质的是:接口是一种约定,而抽象类是一种真实的抽象,它是某一类东西的具体表现.而接口?则什么都不是,只是一种方面的描述.
        抽象类是必将会产生一个真实的对象,而不管这个对象是在继承链的那一层.
        接口仅仅只是一个方面的描述.
        这样就能够明白,什么地方要使用接口,什么地方要使用抽象类.又为什么VB中一个类可以实现多个接口,而只能继承一个类.

适配器模式

       我们有一个现成的类Supply用来记录供应商 ,另外一个开发者Perry也生成一类似于Supply的类叫:SuperSupply,它实现了某一个接口 CompanyInterface(记录相关往来公司信息的接口).功能和Supply差不多,但Perry不能让这个类的成员和Supply成员取一样的名称(觉得Supply中成员名称取的太次了,没一点儿水平.最重要的是,定义CompanyInterface 的人,完全没看到Supply,这人该被罚买王老吉一箱).于是,Perry决定适配 Supply类,因为Supply中的代码还过的去,能完成任务,不出错,

       其实,适配就是将Supply包装一下,换个名称,用另一个成员名称调用其成员.就象给一辆两厢轿车装个吉普的外壳.当然,现实中这样的车很难有吉普的表现,但计算机却无所不能.请看: 

Public   Interface CompanyInterface
    
Function getRank() As Integer   '返回相关公司的级别
    '......

End Interface


Public   Class SuperSupply            'Perry编写的类,它实现了接口:CompanyInterface,能被客户调用
    Implements CompanyInterface

    
Private mSupply As Supply       '被适配的类,它提供了一些要求的具体实现
    Sub New()
        mSupply 
= New Supply
    
End Sub


    
Public Function getRank1() As Integer Implements CompanyInterface.getRank       '将被客户调用的方法:getRank1
        Dim mRank As Integer = -1
        
'........
        mRank = mSupply.SupplyRank                                                  '实际上是间接调用了Supply中的方法:SupplyRank
        '........
        Return mRank
    
End Function

End Class


Public   Class Supply                             '无名英雄,因为它没有实现接口CompanyInterface,不能被客户调用
    Public Function SupplyRank() As Integer
        
Dim mRank As Integer = -1
        
'.......
        Return mRank
    
End Function

End Class

        造成这种现象的原因通俗来比喻,就是:有了一辆两厢车,但越野赛只能让吉普车参加.没办法.这里头:
        越野赛的规定是客户端的请求约定:必须要有四轮驱动,大排汽口什么的.(CompanyInterface)
        吉普车的外壳就是一个适配器,用来适配这些要求和供应者(SuperSupply)
        两厢车就是被适配的对象(Supply).
        这样一来,这个车就能参加比赛了,因为他能跑,而且看上去和别的吉普车没什么区别.如果驾驶员Perry水平高的话,说不定跑的还快...

        适配器模式,书中说了两种类型:类适配器,对象适配器.上面的事例代码是对象适配器,因为Supply类是作为一个对象,来提供被适配的成员.而类适配器是:

Public   Interface CompanyInterface
    
Function getRank() As Integer   '返回相关公司的级别
    '......

End Interface


Public   Class SuperSupply            'Perry编写的类,它实现了接口:CompanyInterface,能被客户调用
    Inherits Supply                 '从supply中派生出来,继承了Supply的所有特性
    Implements CompanyInterface

    
'Private mSupply As Supply       '被适配的类,它提供了一些要求的具体实现
    Sub New()
        
'mSupply = New Supply
    End Sub


    
Public Function getRank1() As Integer Implements CompanyInterface.getRank       '将被客户调用的方法:getRank1
        Dim mRank As Integer = -1
        
'........
        'mRank = mSupply.SupplyRank                                                  '实际上是间接调用了Supply中的方法:SupplyRank
        mRank = SupplyRank()
        
'........
        Return mRank
    
End Function

End Class


Public   Class Supply                             '无名英雄,因为它没有实现接口CompanyInterface,不能被客户调用
    Public Function SupplyRank() As Integer
        
Dim mRank As Integer = -1
        
'.......
        Return mRank
    
End Function

End Class

        和对象适配器不同的是,它直接从Supply中派生,不用有Supply的实例成员变量.他们各有各的不好之处:
        类适配器在SupplySuper要从其他类中派生时,就不能使用了,因为单继承.
        对象适配器,要有一个Supply的事例成员,可能有一些额外的工作如销毁,异常.

外观模式

待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值