软件工程

本类阅读TOP10

·PHP4 + MYSQL + APACHE 在 WIN 系统下的安装、配置
·Linux 入门常用命令(1)
·Linux 入门常用命令(2)
·使用 DCPROMO/FORCEREMOVAL 命令强制将 Active Directory 域控制器降级
·DirectShow学习(八): CBaseRender类及相应Pin类的源代码分析
·基于ICE方式SIP信令穿透Symmetric NAT技术研究
·Windows 2003网络负载均衡的实现
·一网打尽Win十四种系统故障解决方法
·数百种 Windows 软件的免费替代品列表
·收藏---行百里半九十

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
设计模式-职责链的简单应用

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

简单的描述
最近作过的一个信息台的项目里在一个输入框里输入不同的命令,
要求在输入命令的过程中动态的提示输入信息,以及执行相关命令。
通常的做法是在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;
    procedure doExecCmd; 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;


--------------------
我只是抛砖引玉,希望能和大家深入讨论设计模式方面的知识。
请各位兄弟帮帮忙,如果上海,北京有招程序员的通知我一下。[email protected]



相关文章

相关软件