第四章 Caché 设计模式 代理模式

Posted 技术理科直男

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四章 Caché 设计模式 代理模式相关的知识,希望对你有一定的参考价值。

第四章 Caché 设计模式 代理模式

定义

为其他对象提供一种代理以控制对这个对象的访问。

类型

  • 静态代理

  • 动态代理(实现的同学联系我)

使用场景

  • 虚拟代理 根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

  • 安全代理 用来控制真实对象访问时的权限。

  • 智能指引 指当调用真实的对象时,代理处理另外一些事。

优点

  • 真实主题类就是实现实际的业务逻辑,不用关心其他非本职的工作。

  • 真实主题类随时都会发生变化;但是因为它实现了公共接口,所以代理类可以不做任何修改就可以使用。

缺点

  • 当接口方法中添加新的方法之后,目标对象和代理对象都要进行维护。

结构图


完整示例

抽象主题类

 
   
   
 
  1. Class PHA.YX.Design.Proxy.Subject

  2. {


  3. Method GiveDolls() [ Abstract ]

  4. {

  5. }


  6. Method GiveFlower() [ Abstract ]

  7. {

  8. }


  9. Method GiveChocolate() [ Abstract ]

  10. {

  11. }


  12. }

真实主题类

 
   
   
 
  1. Class PHA.YX.Design.Proxy.RealSubject Extends (%RegisteredObject, PHA.YX.Design.Proxy.Subject)

  2. {


  3. Method GiveDolls()

  4. {

  5. w "送玩具给" _ ..girl.nameGet(),!

  6. }


  7. Method GiveFlower()

  8. {

  9. w "送花给" _ ..girl.nameGet(),!

  10. }


  11. Method GiveChocolate()

  12. {

  13. w "送巧克力给" _ ..girl.nameGet(),!

  14. }


  15. Property girl As SchoolGirl;


  16. Method %OnNew(girl As SchoolGirl) As %Status [ Private, ServerOnly = 1 ]

  17. {

  18. s $this.girl=girl

  19. Quit $$$OK

  20. }


  21. }

代理类

 
   
   
 
  1. Class PHA.YX.Design.Proxy.Proxy Extends (%RegisteredObject, PHA.YX.Design.Proxy.Subject)

  2. {


  3. Method GiveDolls()

  4. {

  5. d ..realSubject.GiveDolls()

  6. }


  7. Method GiveFlower()

  8. {

  9. d ..realSubject.GiveFlower()

  10. }


  11. Method GiveChocolate()

  12. {

  13. d ..realSubject.GiveChocolate()

  14. }


  15. Property realSubject As RealSubject;


  16. Method %OnNew(girl As SchoolGirl) As %Status [ Private, ServerOnly = 1 ]

  17. {

  18. s ..realSubject=##class(RealSubject).%New(girl)

  19. Quit $$$OK

  20. }


  21. }

对象类

 
   
   
 
  1. Class PHA.YX.Design.Proxy.SchoolGirl Extends %RegisteredObject

  2. {


  3. Property name As %String [ Private ];


  4. Method nameGet() As %String [ ServerOnly = 1 ]

  5. {

  6. Quit i%name

  7. }


  8. Method nameSet(Arg As %String) As %Status [ ServerOnly = 1 ]

  9. {

  10. s i%name = Arg

  11. Quit $$$OK

  12. }


  13. }

调用

 
   
   
 
  1. /// d ##class(PHA.YX.Design.Program).Proxy()

  2. ClassMethod Proxy()

  3. {

  4. s girl = ##class(PHA.YX.Design.Proxy.SchoolGirl).%New()

  5. d girl.nameSet("姚鑫")

  6. s proxy = ##class(PHA.YX.Design.Proxy.Proxy).%New(girl)

  7. d proxy.GiveChocolate()

  8. d proxy.GiveDolls()

  9. d proxy.GiveFlower()

  10. }

 
   
   
 
  1. DHC-APP>d ##class(PHA.YX.Design.Program).Proxy()

  2. 送巧克力给姚鑫

  3. 送玩具给姚鑫

  4. 送花给姚鑫

思考

小红帮小明去商店买东西。如何用代理实现。感兴趣的同学实现后可以发我一起参考下。


以上是关于第四章 Caché 设计模式 代理模式的主要内容,如果未能解决你的问题,请参考以下文章

第六章 Caché 设计模式 原型模式

Caché高级开发—设计模式 培训总结

第八章 Caché 设计模式 外观模式

第十七章 Caché 设计模式 单例模式

基于`Caché/IRIS`实现`Socket`解决方案

第二章 Caché 算法与数据结构 数组原理