代理模式!

来源:互联网 发布:转手二手物品的软件 编辑:程序博客网 时间:2024/04/29 03:37

看了设计模式有一段时间了, 对面向对象技术也可以说有一定的提高吧,学到的东西总是不敢独享,拿出来与大家同乐吧(写的不好别骂我),今天要说的是代理模式,代理模式在我看这本书的时候没有领会其真正意义,直到我昨天看jive论坛的代码时才真正领会到了代理模式的意义.????????????????????

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 参考:<> 阎宏 著

现在有一个任务就是注册用户,我们可以用普通的方法来写代码, 但是我们现在学设计模式当然就要用模式的思想了,:)

先看一下下面的这个类,这是一个抽象类(所有代码只给出示例,并非完整)

? TUser = class
? public
??? function getID(): Integer; virtual; abstract;
??? function getUserName(): string; virtual; abstract;
??? function getName(): string; virtual; abstract;
??? function getEmail(): string; virtual; abstract;
??? function getPassword(): string; virtual; abstract;
??? procedure setUserName(name: string); virtual; abstract;
??? procedure setName(name: string); virtual; abstract;
??? procedure setPassword(password: string); virtual; abstract;
??? procedure setEmail(email: string); virtual; abstract;
? end;

这个类的意思很明确:规范了用户类的接口、这里就不细说了, 下面我们来看一下这个用户类的代理类

? TUserProxy = class(TUser)
? private
??? FUser: TUser;
? public
??? function getID(): Integer; override;
??? function getUserName(): string; override;
??? function getName(): string; override;
??? function getEmail(): string; override;
??? function getPassword(): string; override;
??? procedure setUserName(name: string); override;
??? procedure setName(name: string); override;
??? procedure setPassword(password: string); override;
??? procedure setEmail(email: string); override;
??? function CheckExist(username: string);
? public
??? constructor Create(AUser: TUser); virtual;
? end

constructor TUserProxy.Create(AUser: TUser);
begin
? FUser := AUser;
end;

function TUserProxy.getEmail: string;
begin
? Result := FUser.getEmail();
end;

//etc.

unit DbUser;

interface

uses User, UserProxy, ConnectionManager, SysUtils, ADODB, DB, Forms;

const
? //////////////////////////////////////////////////////////////////////////////
? INSERT_USER = 'INSERT INTO MUser(userID, userName, name, email, password)' + ' value('
????????????? + ':userID, :userName, :name, :email, :password)';
? LOAD_USER?? = 'SELECT * FROM MUser WHERE userID =:userID';
? DELETE_USER = 'DELETE FROM MUser WHERE userID =:userID';
? UPDATE_USER = 'UPDATE MUser SET ()';
? //////////////////////////////////////////////////////////////////////////////

type
? TDbUser = class(TUser)
? private
??? FConnection: TADOConnection;
??? FADOQuery:?? TADOQuery;
? protected
??? FID: Integer;
??? FUserName: string;
??? FName: string;
??? FPassword: string;
??? FEmail: string;
? public
??? function getID(): Integer; override;
??? function getUserName(): string; override;
??? function getName(): string; override;
??? function getEmail(): string; override;
??? function getPassword(): string; override;
??? procedure setUserName(name: string); override;
??? procedure setName(name: string); override;
??? procedure setPassword(password: string); override;
??? procedure setEmail(email: string); override;
??? procedure Insert();
??? procedure SaveToDb();
??? procedure getProperty(userID: Integer);
??? constructor Create(userID: Integer; userName: string; name: string; password: string; email: string); overload;
??? constructor Create(); overload;
??? property UserName: string read getUserName write setUserName;
??? property Name: string read getName write setName;
??? property Password: string read getPassword write setPassword;
??? property Email: string read getEmail write setEmail;
? end;

这样检查用户是否已存在等逻辑就可以入到这个代理类里来实现(真实的业务逻辑有很多,不只查询用户是否存在), 而添加用户的任务就交给TDbUser类来完成即可以,这样做的好处是, 在没有代码改变的情况下进行扩展!

完                                      by CLH

原创粉丝点击