设计模式-职责链的简单应用(0分)

  • 主题发起人 主题发起人 shouqb
  • 开始时间 开始时间
S

shouqb

Unregistered / Unconfirmed
GUEST, unregistred user!
简单的描述
最近作过的一个信息台的项目里在一个输入框里输入不同的命令,
要求在输入命令的过程中动态的提示输入信息,以及执行相关命令。
通常的做法是在OnKeyPress和OnChange里添加如下代码.
case Key of
A:;
B:;
..
else
..
end;
或者
if length(TEdit(Sender).Text) then
else
if...
在条件分支比较少,或者逻辑简单的时候处理起来比较适用,但如果条件复杂
就会使OnKeyPress和OnChange事件里的代码过长,代码变得烦乱,维护起来的难度加大。
在这个程序里我使用了职责链模式来解耦,效果不错,结构具有良好的扩充性,
达到了期望的目的.
TContext = class(TObject) //维护全局信息
private
...
FInfoStr: TEdit;
public
constructor Create(InfoStr: TEdit);
property InfoStr: String read GetInfoStr;
end;

TFuncChain = class(TObject) //功能链
private
FHandle: TFuncChain;
protected
FConText: TConText;
FAdoQuery: TAdoQuery;
proceduredo
ExecCmd;
virtual;
//这是一个模板方法
public
constructor Create(Handle: TFuncChain;
ConText: TConText;
AdoQ: TAdoQuery);
virtual;
destructor Destroy;
override;
function GetCurWorkNode: TFuncChain;
virtual;
function GetHelpInfo: String;
virtual;
procedure ExecCmd;
end;

其中
constructor TFuncChain.Create(Handle: TFuncChain;
ConText: TConText;
AdoQ: TAdoQuery);
begin
FHandle := Handle;
FConText := Context;
FAdoQuery := AdoQ;
end;

function TFuncChain.GetCurWorkNode: TFuncChain;
begin
if FHandle <> nil then
result := FHandle.GetCurWorkNode
else
result := nil;
end;

在GetCurWorkNode函数里关注感兴趣的信息,
如果是需要的信息则提供及时的帮助和命令解释,否则
执行传递到下一个节点。通过GetHelpInfo和ExecCmd完成帮助和命令解释操作。
子类里的GetCurWorkNode函数
if IsNeedInfo(FConText.InfoStr) then
result := self
else
result := Inherited GetCurWorkNode;
在form里的OnCreate组装各个对象
FConText := TConText.Create(InfoText);
FCmd1 := TCommand1.Create(nil, FConText, AdoQ);
FCmd2 := TCommand2.Create(FCmd1, FConText, AdoQ);
FHeadNode := TCommand3.Create(FCmd2, FConText, AdoQ);
在OnChange事件中
Var
WorkNode: TFuncChain;
begin
WorkNode := FHeadNode.GetCurWorkNode;
if WorkNode <> nil then
btmState.Panels[0].Text := WorkNode.GetHelpInfo
else
btmState.Panels[0].Text := '';
if isRunCmd then
WorkNode.ExecCmd;
end;

--------------------
我只是抛砖引玉,希望能和大家深入讨论设计模式方面的知识。
请各位兄弟帮帮忙,如果上海,北京有招程序员的通知我一下。shouqb@sohu.com
 
希望大家能够多参与讨论
 

Similar threads

I
回复
0
查看
585
import
I
I
回复
0
查看
775
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部