zoukankan      html  css  js  c++  java
  • 模板模式

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

    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
  • 相关阅读:
    获取子进程的是否在线
    python基础知识(二)
    Linux入门50指令
    LInux升级Python版本2.7.11所遇问题汇总
    java开发(1)
    winfrom 水晶报表制作
    asp.net Dock布局开发设置
    winform 窗体最大化事件
    C# 委托于跨线程异步调用
    asp.net-html图片的上传
  • 原文地址:https://www.cnblogs.com/key-ok/p/3358907.html
Copyright © 2011-2022 走看看