設計模式(7)-模板(從事務處理應用的模板)
阿新 • • 發佈:2022-05-04
首先看一個對於資料庫操作的程式:
#include <iostream> using namespace std; class DataOper{ public: void insertStu(){ cout<<"開連線..."<<endl; cout<<"開啟事務..."<<endl; cout<<"執行insert()操作"<<endl; cout<<"提交事務..."<<endl; cout<<"關連線..."<<endl; } void updateStu(){ cout<<"開連線..."<<endl; cout<<"開啟事務..."<<endl; cout<<"執行update()操作"<<endl; cout<<"提交事務..."<<endl; cout<<"關連線..."<<endl; } void deleteStu(){ cout<<"開連線..."<<endl; cout<<"開啟事務..."<<endl; cout<<"執行delete()操作"<<endl; cout<<"提交事務..."<<endl; cout<<"關連線..."<<endl; } }; void main(){ DataOper* dataOper = new DataOper(); dataOper->insertStu(); dataOper->updateStu(); dataOper->deleteStu(); }
我們看執行結果有多個重複的操作
如何避免呢,就是使用模板把我們不需要重複操作的地方封裝起來。
看一下新版程式碼:
#include <iostream> using namespace std; class DataTemplate{ private: void beginConnection(){ cout<<"開連線..."<<endl; } void beginTransation(){ cout<<"開啟事務..."<<endl; } void commitTransation(){ cout<<"提交事務..."<<endl; } void closeConnection(){ cout<<"關連線..."<<endl; } public: virtual void insertData() = 0; virtual void updateData() = 0; virtual void deleteData() = 0; void insertStu(){ beginConnection(); beginTransation(); insertData(); commitTransation(); closeConnection(); } void updateStu(){ beginConnection(); beginTransation(); updateData(); commitTransation(); closeConnection(); } void deleteStu(){ beginConnection(); beginTransation(); deleteData(); commitTransation(); closeConnection(); } }; class DataDeal : public DataTemplate{ public: virtual void insertData(){ cout<<"執行insert()操作"<<endl; } virtual void updateData(){ cout<<"執行update()操作"<<endl; } virtual void deleteData(){ cout<<"執行delete()操作"<<endl; } }; void main(){ DataDeal* dataDeal = new DataDeal(); dataDeal->insertStu(); dataDeal->updateStu(); dataDeal->deleteStu(); }
執行一下結果:
結果相同,但是看看我們的類裡少了很多處理程式,我們只需要關心我們要處理的業務邏輯就可以了。
模板方法的效用一:節省子類程式碼。
這樣,如果我們在父類把方法全部abstract,那麼我們就沒有做到減少子類程式碼的作用。
因此,寫模板方法很容易,但是寫一個好的模板方法就沒那麼容易了。
我們要做到良好的抽取,把固定的實現方法放在父類方法中去實現。
模板方法效用二:防止呼叫操作
在很多關於設計模式的書上,都是把父類的模板方法換成了一個簡單的方法的堆積,如Display**1,Display*2等等。這樣就給很多讀者造成了一種錯覺,覺得模板方法就是去呼叫下面的方法,其實並不盡然。
後面會繼續談到與其它模式的運用組合。