12-代理(Proxy)模式Ruby实现

Posted 架构设计模式

tags:

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

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

关键字Gof 23 设计模式 代理模式 Ruby

Proxy Pattern basedon Ruby

REN gang

Abstract:This paper gives a scene example to describe theuse of Proxy Pattern of Gof 23 Design Pattern, and achieves the example by java,C # and C++, at the same time, gives the UML model of realization of theexample.

Key word: Gof 23; DesignPattern; Proxy Pattern  Ruby

 

1. 标准定义

代理(Proxy)模式标准定义:为其他对象提供一种代理以控制对这个对象的访问。

2. 分析和说明

代理(Proxy)模式属于结构型设计模式。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

代理(Proxy)模式结构如图1所示,其角色包括抽象主题(Subject)角色、代理主题(Proxy)角色和真实主题(Real Subject)角色。

 
1 代理模式结构

抽象主题(Subject)角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题。该类的实现中保存一个引用使得代理可以访问实体.提供一个与实体接口相同的代理接口,这样代理就可以用来替代实体来控制对实体的存取,并可能负责创建和删除实体

    代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或者之后,都要执行某个操作,而不是单纯地将调用传递给真实主题的对象。

    真实主题(Real Subject)角色:定义了代理角色所代表的真实对象,包含实体具体实现代码。

3 应用场景举例

比如公司为了拓展业务,在A省设置办事处。所有在A省的用户请求,都通过该办事处转达到公司,其中办事处就是一个代理机构。

在这里可以把AbstractOrganization类理解为抽象主题(Subject)角色。Agency类是代理主题(Proxy)角色。Corporation类是真实主题(Real Subject)角色。其结构类图如图2所示。Corporation只用继承AbstractOrganization类,而Agency类一方面要继承AbstractOrganization类,同时要聚合Corporation类。


2 代理模式类图

 

4Ruby的实现程序代码

Ruby程序实现主要包括AbstractOrganization抽象类,Agency类和Corporation类等3个类。其关系如图2所示。下面分别列出这3个类的程序代码,最后列出测试代码并显示输出结果。

程序代码清单

 

#!/structuralpatterns/proxy

 

class AbstractOrganization

      

       def  request     

       end

end

 

# 主体公司类

class Corporation < AbstractOrganization    

       def  request

              puts  "这是公司的答复。"

       end

end

 

# 代理类

class Agency < AbstractOrganization   

       def  initialize

         @corporation = nil    

     end 

 

       def  request

              if  @corporation == nil

                     @corporation  = Corporation.new()

              end

              @corporation.request

       end

end

 

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

 

agency = Agency.new

agency.request

 

BEGIN {

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

}

 

END {

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

}

 

代理模式测试类输出结果如下所示:

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

这是公司的答复。

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

 

 

参考文献

[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


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

JAVA SCRIPT设计模式--结构型--设计模式之Proxy代理模式(12)

"围观"设计模式(12)--结构型之代理模式(Proxy Pattern)

二十三种设计模式[12] - 代理模式(Proxy Pattern)

代理模式(Proxy)C++实现

代理模式-Proxy

代理模式-JDK Proxy(Java实现)