注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

LabATSS

关注自动测试软件

 
 
 

日志

 
 

LabVIEW面向对象设计模式学习之六:委托模式  

2011-11-20 10:35:46|  分类: LabVIEW |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

     

Intent(意图)

       为了使得两个独立类共享通用功能而无需将此功能函数提升到一个公共的父类中。

       Motivation(动机)

好的面向对象设计要求每个类重点聚焦于自己的所分配的任务上(类的职责),一个类不应该拥有一个与自己的任务不相关的成员VI。如果你有两个类拥有需要共享的功能函数的话,通用的做法是创建一个父类并让前面的两个类都由此继承。有时你已经拥有了创建好的一个类层次继承结构但是需要添加一个新特性,且新增加的功能特性需要被增加到两个已存在的类中,这两个类要不是没有公共的祖先类,就是即使有祖先类但是几层继承后不是每个子类都应具备新增功能函数。在一些编程语言中你可以使用多继承技术,但是即使在支持多继承的编程语言中,委托也是相对来说更好的选择。

 这个设计模式特别适合以下场景:即当你拥有从祖先类继承而来的一个动态VI,两个继承子类想用同样一个实现来复写该动态VI。委托设计帮助你避免在每个子类中重复的编写同样的实现。

        Implementation(实现):

        由Christinas Rogers重构LabVIEW的Getting Started Windows程序中的Project Wizerd类是委托设计模式的良好例程。关于该例程更多的信息可以参考作者的博客(Eyes on VIs: An Object-Oriented Getting Started Window)。
        委托设计模式的核心思想是:创建一个拥有新功能函数的第三方类,此新类在多数情况下类似“功能帮助类”或“功能助手类”,在这里的“功能”是指将要被委托的功能特性,另外要赋予此类所有新功能所必须使用的作为类数据成员的数据,最后增加第三方类到需要共享新功能的两个继承类中来作为一个数据成员使用(包含于)。

       这两个继承子类覆写祖先类的动态VI,但是它们实际上只需要编写少许代码来调用作为成员数据的功能帮助类的外部同样方法。实际工作的完成完全是由帮助类来实现的。此时这里只有一个代码的唯一实例,这将会使得修复错误变得容易,这两个继承子类将他们的工作都委托给了第三方类——符合了该设计模式的名称。

       也许你想“为什么不在继承类中拥有一个可公共访问的子VI并且不把它们作为每个类成员函数”,答案是:因为第三方类即帮助类也需要一些完成任务所必须的状态数据,因此用类要比可公共访问的子VI要好。如果不能将这些数据放在自己的类中就必然需要放在需要调用的类中,并且在类中这些数据还需保持同步,因此将它们打包成对象,从而获得更好的封装性。

LabVIEW面向对象设计模式学习之六:委托模式 - labats - LabATSS

 

LabVIEW面向对象设计模式学习之六:委托模式 - labats - LabATSS

 

LabVIEW面向对象设计模式学习之六:委托模式 - labats - LabATSS

 

      Editorial Comments (编者意见)

     【Stephen Mercer该设计模式并没有在《设计模式》图书中明显列出,但是核心思想在其他的几个设计模式中均有体现,我想该模式应该给予足够的特别关注。

     David Staab】该设计模式的目标是使得一组公共的通用方法可以被分别多个类访问。在Java编程语言中,你必须创建一个新类并将这些方法放置到该类中,LabVIEW提供更多的选项来取得同样的目标效果,并且不需要总是使用一个类来提供公共地访问。我的实现是对于类的公共方法委托是将它们放置在同一类库中(.lvlib),同时我创建一个新的目录并且将需要被公共访问的VI放置与此目录,一般情况下我将这个目录标记为私有访问,以便只有在此类库中的类可以访问这些方法。这就相当于等效的实现委托而无需一个新类来封装委托方法。这种方式特别简单易用,适合于有对象但是无需构造函数的VI,由此当你实例化一个委托对象时,你不再被强制需要使用一个构造函数来实体化一个类。


原外文及配套样例代码下载

特别说明:在LV9.0中带了Navitation.lvporj项目,大家可以在帮助例程中查询到。

  评论这张
 
阅读(665)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017