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 -桥梁模式类图
3.Ruby的实现程序代码
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.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.
[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 桥梁模式 将类的功能层次结构与实现层结构分离 结构型设计模式