07-桥梁(Bridge)模式Ruby实现

Posted 架构设计模式

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了07-桥梁(Bridge)模式Ruby实现相关的知识,希望对你有一定的参考价值。

摘要:本文用一个实例场景描述Gof 23设计模式中的桥梁模式,并用Ruby程序代码给予实现,同时也给出实现代码的UML模型。

关键字Gof 23 设计模式 桥梁模式 Ruby

Bridge Pattern basedon Ruby

REN gang

Abstract:This paper gives a scene example to describe theuse of Bridge Pattern of Gof 23 Design Pattern, and achieves the example by Ruby,at the same time, gives the UML model of realization of the example.

Key word: Gof 23  Design Pattern  Bridge Pattern Ruby

 

1. 标准定义

桥梁(Bridge)模式标准定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

2. 分析和说明

桥梁(Bridge)模式属于结构型设计模式。它将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

Bridge结构如图1所示。Bridge角色包括抽象化(Abstraction)角色、修正抽象化(Refine Abstraction)角色、实现化(Implementor)角色和具体实现化(Concrete Implementor)角色。


1 -桥梁模式结构

抽象化(Abstraction)角色:Abstraction定义抽象类的接口。维护一个指向Implemcntor类型对象的指针。抽象化(Abstraction)角色可以是接口,也可以是抽象类。属于不可缺少角色。

修正抽象化(Refine Abstraction)角色:RefinedAbstraction扩充由Abstraction定义的接口 Implementor定义实现类的接口。该接口不一定要与Abstraction的接口完全一致。

实现化(Implementor)角色:lmplementor接口仅提供基本操作。这个抽象类规范具体实现化角色,规定出具体实现化角色当有的(非私有)方法和属性。实现化(Implementor)角色可以是接口,也可以是抽象类。属于不可缺少角色。

具体实现化(Concrete Implementor)角色:Concreteimplementor实现Implementor接口并定义它的具体实现。

3 应用场景举例

比如公司有几个技术部门,分别是研发部、开发部和售后服务部。这些部门都有培训和开会等工作。培训的时候,要有培训老师、培训教材、培训人员和培训教室。对于开会也是一样的,有开会的主持人、开会地点等。所以,可以把部门理解为抽象单位,研发部、开发部和售后服务部继承抽象单位并实现具体的工作。日常工作可以抽象起来,培训和开会继承日常工作,不同的部门的日常工作是不同的。

在这里可以把AbstractDepartment类理解为抽象化(Abstraction)角色。AbstractAction类是实现化(Implementor)角色。DevelopmentDep类、FinanceDep类和MarketDep理解为修正抽象化(Refine Abstraction)角色。Meeting类和Training类理解为具体实现化(Concrete Implementor)角色。其结构类图如图2所示。


2 -桥梁模式类图

 

3Ruby的实现程序代码

Ruby程序实现主要包括AbstractAction抽象类、AbstractDepartment抽象类、DevelopmentDep类、FinanceDep类、MarketDep类、Meeting类和Training类等6个类。下面分别列出这6个类的程序代码,最后列出测试代码并显示输出结果。

程序代码清单

 

 

#!/structuralpatterns/bridge

 

class AbstractAction

 

     def doAction(depart,title)

              if  depart == nil

                  puts "这是部门的标准工作活动"

              end        

              puts  "这是" +  depart + "部门的标准工作活动,"+"主题是"+title     

     end 

end

 

class AbstractDepartment

 

     def initialize()

         @departAction = nil         

     end 

      

       def  setAbstractAction(action)

              @departAction  = action

       end

      

       def  action(title)            

              @departAction.doAction("",title)

       end

      

end

 

class Meeting < AbstractAction

      

       def  doAction(depart,title)     

              if  depart == nil

                puts "这是部门的会议工作活动"

               end

              puts  "这是"+depart+"会议工作活动,"+"主题是"+title             

       end

end

 

class Training < AbstractAction    

       def  doAction(depart,title)     

              if  depart == nil

                puts "这是部门的会议工作活动"

               end

              puts  "这是"+depart+"培训工作活动,"+"主题是"+title             

       end

end

 

class DevelopmentDep <  AbstractDepartment  

       @@departName  = "开发部"      

       def  action(title)     

              @departAction.doAction(@@departName,title) 

       end  

end

 

class FinanceDep <  AbstractDepartment   

       @@departName  = "财务部"      

       def  action(title)     

              @departAction.doAction(@@departName,title) 

       end  

end

 

class MarketDep <  AbstractDepartment    

       @@departName  = "市场部"      

       def  action(title)     

              @departAction.doAction(@@departName,title) 

       end  

end

 

# ————————main主程序应用————————

 

#场景1:针对开发部的培训工作

action =   Training.new

depart =   DevelopmentDep.new

depart.setAbstractAction(action)

depart.action("提高开发技能")

 

#场景2:针对财务部的会议

action = Meeting.new()

depart = FinanceDep.new()

depart.setAbstractAction(action)

depart.action("检查会计制度")

             

 

#场景3:针对市场部的培训

action = Training.new()

depart = MarketDep.new()

depart.setAbstractAction(action)

depart.action("沟通技巧")   

 

BEGIN {

    puts "———这是bridge的输出开始———"

}

 

END {

    puts "———这是bridge的输出结束———"

}

 

 

桥梁模式测试类输出结果如下所示:

———这是bridge的输出开始———

这是开发部培训工作活动,主题是提高开发技能

这是财务部会议工作活动,主题是检查会计制度

这是市场部培训工作活动,主题是沟通技巧

———这是bridge的输出结束———

 

 

参考文献

[1] E.Gamma, R.Helm, R.Johnson, andVlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley,1995

[2] E.Gamma, R.Helm, R.Johnson, andVlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.20009

[3] (日)高桥征义,(日)后藤裕藏 著,何文斯 译,Ruby基础教程(第4版),北京:人民邮电出版社.2014.09

[4] 许勇 等编著,Ruby on Rails 程序设计 深入剖析与范例应用,北京:清华大学出版社.2013.07

[5] (美)梅茨 著,张雪平,彭晓东译,面向对象设计实践指南:Ruby语言描述,北京:人民邮电出版社.2014.01

[6] Ruby官方网站:www.ruby-lang.org

[7] Ruby教程 http://www.runoob.com/ruby/ruby-tutorial.html


以上是关于07-桥梁(Bridge)模式Ruby实现的主要内容,如果未能解决你的问题,请参考以下文章

9Bridge 桥梁模式 将类的功能层次结构与实现层结构分离 结构型设计模式

"围观"设计模式(15)--结构型之桥梁模式(Bridge Pattern)

桥接设计模式(Bridge)

桥接模式-Bridge(Java实现)

桥接模式(Bridge)

桥接模式---Bridge