大悟还俗

邮箱 key_ok@qq.com 我的收集 http://pan.baidu.com/share/home?uk=1177427271
  新随笔  :: 联系 :: 订阅 订阅  :: 管理

模板模式

Posted on 2013-10-09 11:53  大悟还俗_2  阅读(275)  评论(0编辑  收藏  举报

这种模式如果不用面向对象的思想的话,也就是

case  Type of

  1:doCreditCardPayment();

  2:doCheckPayment()

end;

然后在doCreditCardPayment中复制一段其它支付方式的代码拷到这个过程中,就搞定了!

但以后如果需要新增加一种付款方式的话,您必须要打开程序,添加某过程,编译。然后进行整体业务流程的测试。

往往程序员在修改主系统时会很头痛的,说不定改了哪部分会导致整体程序出问题。

基于上述原因,我们在想,能不能在不修改主系统的前提下加上这个功能?

我们一般是这样做:

1.先在主系统做一个基类,类似于下述的TPayment,把付款业务的共同代码出来

2.我们就要开发子模块(使用BPL,对于为什么不用DLL,前面有BLOG讲述,在此不再详述),在BPL中uses 主系统的单元,向下继承着写就行了,这样就有点插件的感觉了。

3.当处理到某订单时,可根据订单的付款类型的字符串创建对象,并调用处理方法。

下面程序并未将子类分离至Bpl中,不过应该是很简单的!

这里以TForm类做为TestUnit来测试!

 

 

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TPaymentClass=class of  TPayment;

  TForm1 = class(TForm)
    T1: TButton;
    procedure T1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure CreateObjectByName( const ObjectName : string);
  public
    { Public declarations }
  end;

  TPayment=class(TPersistent)
  protected
    procedure Before_Process;virtual;
    procedure Process;virtual;
    procedure After_Process;virtual;
    procedure GetError;virtual;
  end;

  TCreditCardPayment=class(TPayment)
  protected
    procedure Before_Process;override;
    procedure Process;override;
    procedure After_Process;override;
    procedure GetError;override;
  end;

  TCheckPayment=class(TPayment)
  protected
    procedure Before_Process;override;
    procedure Process;override;
    procedure After_Process;override;
    procedure GetError;override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TCreditCardPayment.After_Process;
begin
  inherited;
  ShowMessage('TCreditCardPayment''After_Process');  //个性事件
end;

procedure TCreditCardPayment.Before_Process;
begin
 inherited;
 ShowMessage('TCreditCardPayment''Before_Process');//个性事件
end;

procedure TCreditCardPayment.GetError;
begin
  inherited;
  ShowMessage('TCreditCardPayment''GetError');  //个性事件
end;

procedure TCreditCardPayment.Process;
begin
  inherited;
  ShowMessage('TCreditCardPayment''Process'); //个性事件
end;


{ TCheckPayment }

procedure TCheckPayment.After_Process;
begin
  inherited;
  ShowMessage('TCheckPayment.After_Process');  //个性事件
end;

procedure TCheckPayment.Before_Process;
begin
  inherited;
  ShowMessage('TCheckPayment.Before_Process'); //个性事件
end;

procedure TCheckPayment.GetError;
begin
  inherited;
   ShowMessage('TCheckPayment.GetError'); //个性事件
end;

procedure TCheckPayment.Process;
begin
  inherited;
  ShowMessage('TCheckPayment.Process');  //个性事件
end;

procedure TForm1.CreateObjectByName(const ObjectName: string);
var
  fc : TPaymentClass;
  f : TPayment;
begin
  fc := TPaymentClass(FindClass(ObjectName));
  f := fc.Create();
  f.Process;

end;


procedure TForm1.T1Click(Sender: TObject);

begin
  CreateObjectByName('TCheckPayment');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RegisterClass(TPayment);
  RegisterClass(TCreditCardPayment);
  RegisterClass(TCheckPayment);
end;



{ TPayment }

procedure TPayment.After_Process;
begin
  //处理付款的公共事件
end;

procedure TPayment.Before_Process;
begin
   //处理付款的公共事件
end;

procedure TPayment.GetError;
begin
  //处理付款的公共事件
end;

procedure TPayment.Process;
begin
   //处理付款的公共事件
end;

end.
View Code