桥接模式
桥接模式和适配器模式形式上差不多,都是为现有的类来适配一个接口.
比如,现在又两个类: Supply 和 SupplySuper,均提供了功能差不多的成员: StopUse,Address,Name,Rank...
为了更有效的在我们的代码体系中使用这两个现存的类,我们可以提升这两个类的相似成员到一个接口 CompanyInterface,然后为 Supply, SupplySuper分别派生两个类型: SuppplyCompany, SupplySuperCompany.
这两个公司又分别用类适配模式适配Supply,SupplySuper.
为什么要单独有桥接模式呢?
桥接模式,是为了统一多个现有的类型,以提供一致的成员给客户代码使用.而适配模式是为了将一个现有的类来适应现有的客户代码要求,正是因为他们各自产生的原因不同,也就分别应用在不同的场景之中.桥接模式严格来说应该是适配模式的一种扩展.
Perry个人认为不同的名称,是为了区分在不同的情景之下不同作法的一种说法(好听些就是:构建模式),
要注意,设计模式,是一些编程方法的总结,而不是设计工具,也不是编程框架和规范.
不同的模式,指代了不同场景的较佳的解决方式.如适配模式,如果您的项目一开始设计的很合理,就不可能出现要使用适配模式的情况,因为不会出现先有类,然后再来设计用户接口的问题.
接口型模式总结
主要是描述怎样提供合适的成员给客户代码的这样一种方式.
职责型模式
简介
描述类中成员的工作方式.通俗说,每一个及类中的每一个成员,均有自己的存在目标即职责.而如何更好的组织和适用这些职责,就是职责型模式所要描述的.
Perry可能没注意到,类,成员的名称也是有职责的。就是名称要能有自说明性质,用来直观说明这个东西是干什么用的。
名称的自说明在CC2E中有详细说明,摘录一段如下:
...变量和变量名就本质而言却是同一事物...
...变量的好与坏很大程度上取决于它的命名的好坏...
详情请看:[CC2E] The Power of Variable Names P259
以下和职责模式没关系:
Design Patterns in C#书中强调了一点:类的可访问性是对类的定义而言,不是对对象。
就是说:
代码中的Me.id = supplyObj.id是完全没有问题的,因为me是Supply 类型,因此它可以访问同是Supply类型的supplyObj对象的私有成员。
Perry觉得这一强调,真是太及时了。因为,他以前就没有注意到这个概念。
他想,继承链对这个概念有没有影响呢?经过试验:
Public Class Supply
Protected id As Integer
'.......
End Class
Public Class SupplyChild
Inherits Supply
Public Sub copy(ByVal supplyObj As Supply)
Me.id = supplyObj.id
End Sub
End Class
果然以下语句有问题,不能读取父类对象的保护模式成员:
Me.id = supplyObj.id
'WindowsApplication1.Supply.id' is not accessible in this context because it is 'Protected'.
这又是为什么呢?protected是可以由派生类访问的啊?Perry不明白...难道只限于类型本身的定义,而不能用于派生类型?以下代码是OK的:
Public Class SupplyChild
Inherits Supply
Public Sub copy(ByVal supplyObj As SupplyChild) '类型本身的对象就可以
Me.id = supplyObj.id
End Sub
End Class
最终原因,可能是:
Public Sub copy(ByVal supplyObj As Supply)
Me.id = supplyObj.id
中的ByVal supplyObj As Supply表明 supplyObj是一个对象,而protected成员是在对象之外看不到的。Perry都觉得这个解释很牵强...
而Public Sub copy(ByVal supplyObj As SupplyChild)是可以自省到自身类的成员.
或者“类的可访问性是对类的定义而言,不是对对象。”的描述是不准确的?应该是“类型定义中可以访问本类型对象的所有成员”?这种情况只是一个特例?要不怎么不能访问到父类的protected的成员?
这种情况在Java中似乎又不一样。请见我写的另外一文: <<DesignPatterns for Java>>
而在C++中情况又和VB相似:supply.h:12: error: `int Supply::ID' is protected。编译通不过。
看来,应该是“类型定义中可以访问本类型对象的所有成员”,而不能是其他类型。
理由如下:
Public Sub copy(ByVal supplyObj As Supply)
Me.id = supplyObj.id的编译器解释过程:
先取supplyObj类型,结果是 “Supply”
然后取“id”的定义,因为它是protected,在类定义之外取不到
报错
而, Public Sub copy(ByVal supplyObj As SupplyChild)
Me.id = supplyObj.id
编译器先取supplyObj类型,结果是 “SupplyChild”
然后取“id”的定义,因为它是本身的类型中定义的(从Supply继承)能够找到
OK
单件模式
模式定义的原话如下:
“单件模式要求一个类有且仅有一个实例,与此同时,提供了一个全局的访问点。”
为什么会有这样的场景出现呢?Perry觉得可能是因为:
类创建需要大量的资源,如数据库服务器连接
类在系统中只需要一个,没必要出现另外的。如日志管理器
单件模式实现是比较简单:
Public Class SupplyClient
Private Shared mSupplyClient As SupplyClient
Private Sub New()
'...
End Sub
pubic Shared Function SupplyClientFactory() As SupplyClient
If (mSupplyClient Is Nothing) Then
mSupplyClient = New SupplyClient
End If
Return mSupplyClient
End Function
End Class
因为New方法是private所以,其他类型中的以下语句会报错:
Dim objT As New SupplyClient
'WindowsApplication1.SupplyClient.Private Sub New()' is not accessible in this context because it is 'Private'.
就可以确保,不能由New来构建类型的对象实例。
而
Private Shared mSupplyClient As SupplyClient
Public Shared Function SupplyClientFactory() As SupplyClient
就保证了类型只会有一个实例。
如何识别单件模式?不知道...如果满足前面说的条件,应该可以使用单件模式吧?
Perry你自己看着办吧...
观察者模式
待续...
Public Class Supply
Private id As Integer
Public Sub copy(ByVal supplyObj As Supply)
Me.id = supplyObj.id
End Sub
'...