设计模式与VB .net实现 桥接模式,单件模式

 

接模式


桥接模式和适配器模式形式上差不多,都是为现有的类来适配一个接口.

比如,现在又两个类: 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是完全没有问题的,因为meSupply 类型,因此它可以访问同是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

         '...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值