对象控件熬之滴水穿石:Delphi曾经的利器(4)

本文探讨了VCL中使用的设计模式,包括观察者模式、命令模式及表面模式,并详细介绍了这些模式的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近研究对象控件,稍微总结一下,以后继续补充:

    

                                                                               8--VCL的设计模式

    

    

设计模式是我在弄JAVA编程时开始垂垂熟悉起来的,记得事先还特地看了四人组写的《 设计模式》一书。第一次看时收获不大,反而陷进了为模式写代码的窠臼。当初想一想事先理解明快很大部分原因就是看不到实实在在的例子,所看到的都是一些与实际任务并不是有很大关系的代码。说白了就是一个纯理论的货色,事先的网络搜索远没有当初这般兴旺便捷,所以所看到的代码所获取的感受很是范围。回头看Delphi的底层代码时,发明了很多比较熟悉的写法。VCL还是用了不少的设计模式,以至于DELPHI的程序员的编码任务已经凌驾在模式之上了。好了,就单单VCL的代码,说说我对于设计模式的理解吧!当然这个模式是限于DELPHI,设计模式在以后的篇幅中,我还是会提到的。

    


    

在Delphi的组件时间里,我见到了组件之间是通过类似于观察者模式的一种设计方式,其主要原因组件类只见都是由Componet类派生下来的,所以各个组件之间的关系如何管理便是首当其冲的问题,所以当一个对象和其它对象互动时,能让对方晓得每个对象的状态转变。基本思路是在 Component对象在创立的时候,就会用数据结构(一般都是用TList)将子类对象参加其管理的范围内,当Component在遇到析构时,实际上就采用一个叫Notification的方法,告诉相干的对象你需要free掉了。这些需要通知的动作,在VCL里一般都是用枚举类型来定义的。一般需要停止通知的母体必然是一个容器,像我们用到的Form对象它实际上就相当于是一个容器,而上面的button和text文本框等则都是被通知的对象。在容器对象中设计了一个 Notify的接口,容器在初始化时加载相干的类,然后确保当有事件触发时可以通知到所管理的各个类。

    

我在VCL的 TCollectionTCollectionItem中曾看过该模式的代码,在与Notify的方法一般都定义为virtual方法了。这样相干的派生类可以增长各种需要通知事件的代码。

    


    

Delphi里有个控件叫 TACTION,这个控件就是由一种设计模式衍生而来的,这个模式便是命令模式( Command)。这个模式的用处就是封装客户端发来的请求。在应用Action控件编程时我们就可以发明,全部的处置代码可写在Action里,而我们所触发事件的按钮只需要与相干的 Action的Exeute方法挂接起来便可完成功能。平日我们会在一个datamoudal中放置action控件,以实现请求的对象与客户端代码分离。这样一来,全部界面上请求的都是通过Action这个对象的方法来实现功能的,整个请求框架形成了一个完整的类架构。当然实现这个控件的方法显然比Command模式更为复杂起来。
    每日一道理
“上下五千年,龙的看火不灭;古有愚公志,而今从头越…… ”站在新世纪的门槛上,我们的追求就是让祖国灿烂的喜悦飞扬在美好的明天……

    


    

在我编写MIDAS代码的日子里,我经常用到了 Data Provider控件。该控件是放在一个名为Remote DataModule的模块中,其实是在接受由Client端的调用,通过它去拜访或操纵相干的数据。后来我才发明,其实Data Provider控件本身就是一个很明显的设计模式--表面模式( Facade)。而与该控件相干的便是TDispatchAppServer类,这便是一个典范的Facade.在Data Provvider绑定的dataset里,实现了更多细节的代码。而作为Client端在调用方法时根本不需要考虑你是怎么用哪个dataset去存储数据去处置数据的。它只需要调用类似的方法便可完成任务,所以这类模式在分布式的系统很吃香!在长久的EJB时代,SessionBean就是从这衍生而来的。在Delphi,这个表面类叫作IAppServer,它对外供给了一个一致的接口可以便于调用群组服务,它分离了客户端和服务端的依附关系,像在C/S时代,客户端连接数据,就必定需要这类或者那样的设置,在客户端写这样或者那样的SQL语句,而这些对于表面模式来讲,客户端根本无须晓得。

    


    

其实在DLPHI中我觉得Table,Query等数据操纵集控件都是非常壮大并且很具有设计思惟的类。像Table这样的控件其实就是用户在处置这个数据库表时,用Table这样的类去封装了这个数据表的类对象,再调用其中的方法来处置这个数据库表,这是如许伟大和壮大的方法啊!这样让程序员不再自行编写复杂的代码来存储数据了。当然这些控件的实现并不想java中ibatis一样,它只是面向数据的,都是以数据处置为主的而非对象的,但这足以非常壮大了。

    

                                                                          (未完待续...........)

文章结束给大家分享下程序员的一些笑话语录: 人工智能今天的发展水平:8乘8的国际象棋盘其实是一个体现思维与创意的强大媒介。象棋里蕴含了天文数字般的变化。卡斯帕罗夫指出,国际象棋的合法棋步共有1040。在棋局里每算度八步棋,里面蕴含的变化就已经超过银河系里的繁星总数。而地球上很少有任何数量达到这个级别。在金融危机之前,全世界的财富总和大约是1014人民币,而地球人口只有1010。棋盘上,所有可能的棋局总数达到10120,这超过了宇宙里所有原子的总数!经典语录网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值