最近研究对象控件,稍微总结一下,以后继续补充:
8--VCL的设计模式
设计模式是我在弄JAVA编程时开始垂垂熟悉起来的,记得事先还特地看了四人组写的《 设计模式》一书。第一次看时收获不大,反而陷进了为模式写代码的窠臼。当初想一想事先理解明快很大部分原因就是看不到实实在在的例子,所看到的都是一些与实际任务并不是有很大关系的代码。说白了就是一个纯理论的货色,事先的网络搜索远没有当初这般兴旺便捷,所以所看到的代码所获取的感受很是范围。回头看Delphi的底层代码时,发明了很多比较熟悉的写法。VCL还是用了不少的设计模式,以至于DELPHI的程序员的编码任务已经凌驾在模式之上了。好了,就单单VCL的代码,说说我对于设计模式的理解吧!当然这个模式是限于DELPHI,设计模式在以后的篇幅中,我还是会提到的。
在Delphi的组件时间里,我见到了组件之间是通过类似于观察者模式的一种设计方式,其主要原因组件类只见都是由Componet类派生下来的,所以各个组件之间的关系如何管理便是首当其冲的问题,所以当一个对象和其它对象互动时,能让对方晓得每个对象的状态转变。基本思路是在
Component对象在创立的时候,就会用数据结构(一般都是用TList)将子类对象参加其管理的范围内,当Component在遇到析构时,实际上就采用一个叫Notification的方法,告诉相干的对象你需要free掉了。这些需要通知的动作,在VCL里一般都是用枚举类型来定义的。一般需要停止通知的母体必然是一个容器,像我们用到的Form对象它实际上就相当于是一个容器,而上面的button和text文本框等则都是被通知的对象。在容器对象中设计了一个
Notify的接口,容器在初始化时加载相干的类,然后确保当有事件触发时可以通知到所管理的各个类。
我在VCL的
TCollection和
TCollectionItem中曾看过该模式的代码,在与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,这超过了宇宙里所有原子的总数!经典语录网