如何在delphi中实现visitor&RTTI的合作?(300分)

W

wisenow

Unregistered / Unconfirmed
GUEST, unregistred user!
初学设计模式,受益匪浅!
昨天看了visitor模式,把别人用java写的一个visitor模式改写成delphi了,不过visitor的局限性各位大虾都明白吧?
为了使visitor模式便于扩展,所以引入了RTTI,但是在Delphi中该如何实现visitor&RTTI?还望高手指教!
 
visitor模式的java版
-----------------------------------------------------------------
interface ErrorBase
{
public void handle(ErrorHandler handler);
}
class DBError implements ErrorBase
{
public void handle(ErrorHandler handler) {
handler.handle(this);
}
}
class CommError implements ErrorBase
{
public void handle(ErrorHandler handler) {
handler.handle(this);
}
}
interface ErrorHandler
{
public void handle(DBrror dbError);
public void handle(CommError commError);
}
class GUISys implements ErrorHandler
{
public void announceError(ErrorBase error) {
error.handle(this);
}
public void handle(DBError dbError) {
/* 通知用户界面进行有关数据库错误的处理 */
}
public void handle(CommError commError) {
/* 通知用户界面进行有关通信错误的处理 */
}
}
class LogSys implements ErrorHandler
{
public void announceError(ErrorBase error) {
error.handle(this);
}
public void handle(DBError dbError) {
/* 通知日志系统进行有关数据库错误的处理 */
}
public void handle(CommError commError) {
/* 通知日志系统进行有关通信错误的处理 */
}
}
visitor模式delphi版(我改的)
------------------------------------------------------
type
TErrorHandle = class;
TErrorBase = class // 错误基类
protected
proceduredo
Handle(Handler: TErrorHandle);
virtual;
abstract;
// 纯虚函数,等待其子类重载
public
procedure Handle(Handler: TErrorHandle);
end;

TCommError = class(TErrorBase) // 通信错误类
protected
proceduredo
Handle(Handler: TErrorHandle);
override;
// 重载DoHandle函数,写通信错误处理代码
public
Error: string;
end;

TDBError = class(TErrorBase) // 数据库错误类
protected
proceduredo
Handle(Handler: TErrorHandle);
override;
// 重载DoHandle函数,写数据库错误处理代码
public
ErrorCode: integer;
end;

TErrorHandle = class // 错误处理基类
protected
proceduredo
Handle(CommError: TCommError);
overload;
virtual;
proceduredo
Handle(DBError: TDBError);
overload;
virtual;
public
procedure announceError(error: TErrorBase);
procedure Handle(error: TCommError);
overload;
procedure Handle(error: TDBError);
overload;
end;

TSys1 = class(TErrorHandle) // 系统1错误处理类
protected
proceduredo
Handle(CommError: TCommError);
overload;
override;
proceduredo
Handle(DBError: TDBError);
overload;
override;
end;

TSys2 = class(TErrorHandle) // 系统2错误处理类
protected
proceduredo
Handle(CommError: TCommError);
overload;
override;
proceduredo
Handle(DBError: TDBError);
overload;
override;
end;

implementation
{ TCommError }
procedure TCommError.DoHandle(Handler: TErrorHandle);
begin
inherited;
ShowMessage(Error);
// 处理错误
Handler.Handle(Self);
// 处理完成,后续操作交于调用者
end;

{ TDBError }
procedure TDBError.DoHandle(Handler: TErrorHandle);
begin
inherited;
ShowMessage('错误代码:' + IntToStr(ErrorCode));
Handler.Handle(self);
end;

{ TSys1 }
procedure TSys1.DoHandle(CommError: TCommError);
begin
inherited;
ShowMessage('以上错误已被TCommError处理'#10'TSys1');
end;

procedure TSys1.DoHandle(DBError: TDBError);
begin
inherited;
ShowMessage('以上错误已被TDBError处理'#10'TSys1');
end;

{ TErrorHandle }
procedure TErrorHandle.announceError(error: TErrorBase);
begin
error.Handle(self);
end;

procedure TErrorHandle.DoHandle(DBError: TDBError);
begin

end;

procedure TErrorHandle.DoHandle(CommError: TCommError);
begin

end;

procedure TErrorHandle.Handle(error: TCommError);
begin
do
Handle(error);
end;

procedure TErrorHandle.Handle(error: TDBError);
begin
do
Handle(error);
end;

{ TSys2 }
procedure TSys2.DoHandle(CommError: TCommError);
begin
inherited;
ShowMessage('以上错误已被TCommError处理'#10'TSys2');
end;

procedure TSys2.DoHandle(DBError: TDBError);
begin
inherited;
ShowMessage('以上错误已被TDBError处理'#10'TSys2');
end;

{ TErrorBase }
procedure TErrorBase.Handle(Handler: TErrorHandle);
begin
do
Handle(Handler);
end;

end.
 
visitor&RTTI(java版)
---------------------------------------
interface ErrorBase
{
public void handle(ErrorHandler handler);
}
class DBError implements ErrorBase
{
public void handle(ErrorHandler handler) {
try {
DbErrorHandler dbHandler = (DbErrorHandler)handler;
dbHandler.handle(this);
}
catch(ClassCastException e) {
}
}
}
class CommError implements ErrorBase
{
public void handle(ErrorHandler handler) {
try {
CommErrorHandler commHandler = (CommErrorHandler)handler;
commHandler.handle(this);
}
catch(ClassCastException e)/ {
}
}
}
interface ErrorHandler
{
}
interface DbErrorHandler
{
public void handle(DBrror dbError);
}
interface CommErrorHandler
{
public void handle(CommError commError);
}
class GUISys implements ErrorHandler, DbErrorHandler, CommErrorHandler
{
public void announceError(ErrorBase error) {
error.handle(this);
}
public void handle(DBError dbError) {
/* 通知用户界面进行有关数据库错误的处理 */
}
public void handle(CommError commError) {
/* 通知用户界面进行有关通信错误的处理 */
}
}
class LogSys implements ErrorHandler, DbErrorHandler, CommErrorHandler
{
public void announceError(ErrorBase error) {
error.handle(this);
}
public void handle(DBError dbError) {
/* 通知日志系统进行有关数据库错误的处理 */
}
public void handle(CommError commError) {
/* 通知日志系统进行有关通信错误的处理 */
}
}
 
重赏之下也不出勇夫,叹...
帮忙提前者也有分
 
不知道你所说的扩展是怎么个扩展发。我们公司里以前有人作过一个系统,动态加载、调用DLL,可以添加新功能。你可以看看有关插件的东西,我觉得和你说的差不多
 
type
TErrorHandle = class;
TErrorBase = class
procedure handle(ErrorHandle:TErrorHandle);virtual;abstract;
end;
TErrorHandle=class
procedure announceError(ErrorBase:TErrorBase);virtual;abstract;
end;
TDBError=class(TErrorBase)
public
procedure handle(ErrorHandle:TErrorHandle);override;
function Algothim():string;
end;
TSys=class(TErrorHandle)
public
procedure announceError(ErrorBase:TErrorBase);override;
end;

implementation
procedure TErrorBase.handle(ErrorHandle: TErrorHandle);
begin
inherited;
ErrorHandle.announceError(self);
end;

function TDBError.Algothim: string;
begin
Result:='Algothim';
end;

procedure TSys.announceError(ErrorBase: TErrorBase);
begin
inherited;
if ErrorBase is TDBError then
showmessage(TDBError(ErrorBase).Algothim);
end;


 
顶部