这是看Design Patterns in C#同步的心得记录.里头记录了VB的实现代码,还有一些感性认识,另外,忽略一些C#的特性和不太相关的东西.
这本书买了有两年了,开始时看不懂.直到近来才有所体会.
第一部分 接口型模式
简介
接口型模式,通俗的说就是使用一种约定好的接口,来完成两个类之间的调用.先不管这中约定是为什么而来.
接口为什么而来的问题,将会对应产生不同的接口型模式.
接口和抽象类的区别,我认为最本质的是:接口是一种约定,而抽象类是一种真实的抽象,它是某一类东西的具体表现.而接口?则什么都不是,只是一种方面的描述.
抽象类是必将会产生一个真实的对象,而不管这个对象是在继承链的那一层.
接口仅仅只是一个方面的描述.
这样就能够明白,什么地方要使用接口,什么地方要使用抽象类.又为什么VB中一个类可以实现多个接口,而只能继承一个类.
适配器模式
我们有一个现成的类Supply用来记录供应商 ,另外一个开发者Perry也生成一类似于Supply的类叫:SuperSupply,它实现了某一个接口 CompanyInterface(记录相关往来公司信息的接口).功能和Supply差不多,但Perry不能让这个类的成员和Supply成员取一样的名称(觉得Supply中成员名称取的太次了,没一点儿水平.最重要的是,定义CompanyInterface 的人,完全没看到Supply,这人该被罚买王老吉一箱).于是,Perry决定适配 Supply类,因为Supply中的代码还过的去,能完成任务,不出错,
其实,适配就是将Supply包装一下,换个名称,用另一个成员名称调用其成员.就象给一辆两厢轿车装个吉普的外壳.当然,现实中这样的车很难有吉普的表现,但计算机却无所不能.请看:
Function getRank()Function getRank() As Integer '返回相关公司的级别
'......
End Interface
Public Class SuperSupply Class SuperSupply 'Perry编写的类,它实现了接口:CompanyInterface,能被客户调用
Implements CompanyInterface
Private mSupply As Supply '被适配的类,它提供了一些要求的具体实现
Sub New()Sub New()
mSupply = New Supply
End Sub
Public Function getRank1()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 Class Supply '无名英雄,因为它没有实现接口CompanyInterface,不能被客户调用
Public Function SupplyRank()Function SupplyRank() As Integer
Dim mRank As Integer = -1
'.......
Return mRank
End Function
End Class
造成这种现象的原因通俗来比喻,就是:有了一辆两厢车,但越野赛只能让吉普车参加.没办法.这里头:
越野赛的规定是客户端的请求约定:必须要有四轮驱动,大排汽口什么的.(CompanyInterface)
吉普车的外壳就是一个适配器,用来适配这些要求和供应者(SuperSupply)
两厢车就是被适配的对象(Supply).
这样一来,这个车就能参加比赛了,因为他能跑,而且看上去和别的吉普车没什么区别.如果驾驶员Perry水平高的话,说不定跑的还快...
适配器模式,书中说了两种类型:类适配器,对象适配器.上面的事例代码是对象适配器,因为Supply类是作为一个对象,来提供被适配的成员.而类适配器是:
Function getRank()Function getRank() As Integer '返回相关公司的级别
'......
End Interface
Public Class SuperSupply Class SuperSupply 'Perry编写的类,它实现了接口:CompanyInterface,能被客户调用
Inherits Supply '从supply中派生出来,继承了Supply的所有特性
Implements CompanyInterface
'Private mSupply As Supply '被适配的类,它提供了一些要求的具体实现
Sub New()Sub New()
'mSupply = New Supply
End Sub
Public Function getRank1()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 Class Supply '无名英雄,因为它没有实现接口CompanyInterface,不能被客户调用
Public Function SupplyRank()Function SupplyRank() As Integer
Dim mRank As Integer = -1
'.......
Return mRank
End Function
End Class
和对象适配器不同的是,它直接从Supply中派生,不用有Supply的实例成员变量.他们各有各的不好之处:
类适配器在SupplySuper要从其他类中派生时,就不能使用了,因为单继承.
对象适配器,要有一个Supply的事例成员,可能有一些额外的工作如销毁,异常.
外观模式
待续...