这种模式如果不用面向对象的思想的话,也就是
case Type of
1:doCreditCardPayment();
2:doCheckPayment()
end;
然后在doCreditCardPayment中复制一段其它支付方式的代码拷到这个过程中,就搞定了!
但以后如果需要新增加一种付款方式的话,您必须要打开程序,添加某过程,编译。然后进行整体业务流程的测试。
往往程序员在修改主系统时会很头痛的,说不定改了哪部分会导致整体程序出问题。
基于上述原因,我们在想,能不能在不修改主系统的前提下加上这个功能?
我们一般是这样做:
1.先在主系统做一个基类,类似于下述的TPayment,把付款业务的共同代码出来
2.我们就要开发子模块(使用BPL,对于为什么不用DLL,前面有BLOG讲述,在此不再详述),在BPL中uses 主系统的单元,向下继承着写就行了,这样就有点插件的感觉了。
3.当处理到某订单时,可根据订单的付款类型的字符串创建对象,并调用处理方法。
下面程序并未将子类分离至Bpl中,不过应该是很简单的!
这里以TForm类做为TestUnit来测试!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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.