10-门面(Facade)模式Ruby实现
Posted 架构设计模式
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10-门面(Facade)模式Ruby实现相关的知识,希望对你有一定的参考价值。
摘要:本文用一个实例场景描述Gof 23设计模式中的门面模式,并用Ruby程序代码给予实现,同时也给出实现代码的UML模型。
关键字:Gof 23 设计模式 门面模式 Ruby
Facade Pattern basedon Ruby
REN gang
Abstract:This paper gives a scene example to describe theuse of Facade of Pattern 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 Facade Pattern Ruby
1. 标准定义
门面(Facade)模式标准定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
2. 分析和说明
门面(Facade)模式也叫外观模式,属于结构型设计模式。外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
Facade结构如图1所示。其角色包括门面(Facade)角色和子系统(Subsystem)角色。
图1 门面模式结构
门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统(Subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
3 应用场景举例
比如公司总有前台,来访的人员主要是做这几类工作,一类是过来工作,一类是访客,一类是邮差送东西,还有就是领导视察等。但是都是通过前台来实现。
在这里可以把Facade类理解为门面(Facade)角色。DoWork类,Inspection类,Post类和Visit类是子系统(Subsystem)角色。其结构类图如图2所示。Facade类聚合DoWork类,Inspection类,Post类和Visit类等四个类。
图2 门面模式类图
3.Ruby的实现程序代码
Ruby程序实现主要包括Facade类,DoWork类,Inspection类,Post类和Visit类等5个类。下面分别列出这5个类的程序代码,最后列出测试代码并显示输出结果。
程序代码清单
#!/structuralpatterns/facade
class DoWork
def operate puts "员工:打卡考勤。" end end
class Inspection
def operate puts "领导视察:端茶倒水。" end end
class Post
def operate puts "邮递员:登记收发物品。" end end
class Visit
def operate puts "访客:登记身份证。" end end
class Facade
def initialize() @visit = Visit.new @post = Post.new @inspection = Inspection.new @doWork = DoWork.new end
def Operate(operation) if operation.downcase == "visit" @visit.operate() elsif operation.downcase == "post" @post.operate() elsif operation.downcase == "inspection" @inspection.operate() elsif operation.downcase =="dowork" @doWork.operate() else puts "没有对应事项,不能工作。" end end end
# ————————main主程序应用————————
facade = Facade.new()
#向前台要求访客 facade.Operate("visit")
#向前台提交邮品 facade.Operate("post")
#领导过来视察 facade.Operate("inspection")
#员工上班 facade.Operate("doWork")
#study是没有对应的工作接口 facade.Operate("study")
BEGIN { puts "———这是facade的输出开始———" }
END { puts "———这是facade的输出结束———" }
|
门面模式测试类输出结果如下所示:
———这是facade的输出开始——— 访客:登记身份证。 邮递员:登记收发物品。 领导视察:端茶倒水。 员工:打卡考勤。 没有对应事项,不能工作。 ———这是facade的输出结束——— |
参考文献
[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.
以上是关于10-门面(Facade)模式Ruby实现的主要内容,如果未能解决你的问题,请参考以下文章