3. 業務應用
為了實現具體的業務應用,我們還需要做兩件事:
1. 編號規則的持久化(一般使用XML,暫省略)
2. 編號的獲取和更新
我們可以在業務層定義了下面兩個接口,方便供客戶使用:
Code
1 INumberGenerator = interface
2 function NextNumber: string;
3 end
Code
1 INumberCalculator = interface
2 procedure Validate(const number: string);
3 function Compare(const startNumber, endNumber: string): Integer;
4 function GetCount(const startNumber, endNumber: string): Int64;
5 function GetEndNumber(const startNumber: string; count: Int64): string;
6 end
我們只需要通過訪問一個全局的Factory/Registry來獲得一個當前Context的INumberGenerator實例,然後調用NextNumber方法就可以獲取編號。其實現可參考:
Code
1 TDBNumberGenerator = class(TInterfacedObject, INumberGenerator)
2 private
3 fRule: TNumberRule;
4 fDataSet: TDataSet;
5 fTypeID: string;
6 public
7 { 訪問數據庫的編號表,根據TypeID進行行鎖定(悲觀鎖),讀取當前可用的編號後,調用fRule的NextNumber,把結果更新回去 }
8 function NextNumber: string;
9 end
INumberCalculator接口主要針對那些手工輸入編號或需要進行統計編號數量的應用(比如,輸入開始卡號和結束卡號,自動計算數量)。
最後,期待大家的批評和指點。