在前面大致講了設計模式六大原則及三大模型(行為型、創建型、結構型)23種設模式;本文講模版方法屬於行為型模式; 模版方法:簡單講是定了一個演算法骨架,將可變的部分延遲到了子類,由子類來實現,封裝不可變的,也是一種多態的實現; 有這樣的一個場景:需要對數據進行CURD操作,且能支持不同的資料庫操作,我們 ...
在前面大致講了設計模式六大原則及三大模型(行為型、創建型、結構型)23種設模式;本文講模版方法屬於行為型模式;
模版方法:簡單講是定了一個演算法骨架,將可變的部分延遲到了子類,由子類來實現,封裝不可變的,也是一種多態的實現;
有這樣的一個場景:需要對數據進行CURD操作,且能支持不同的資料庫操作,我們可能會用EF進行封裝或者其他orm框架,也可以自己實現,如果用到EF進行封裝,基本上每種數據都會支持CURD簡單操作;
但這隻是針對簡單操作,針對複雜批量語句操作可能效率不高,這樣我們就會想到直接操作資料庫,而不同的資料庫操作sql語句不一樣,這樣我們就要封裝一個抽象類,把共有的方法由抽象類實現,把個性化如批量插入的方法由子類來實現,這就利用了模版方法的設計思想;
限定一個抽象基類實現基本CURD操作
public abstract class Repository<T> where T:class { /// <summary> /// 新增 /// </summary> /// <param name="entity"></param> public void Insert(T entity) { //...... } /// <summary> /// 更新 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool Update(T entity) { //...... return true; } /// <summary> /// 刪除 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool Delete(T entity) { //...... return true; } /// <summary> /// 查找 /// </summary> /// <param name="id"></param> /// <returns></returns> public List<T> Query(int id) { //...... return new List<T>(); } /// <summary> /// 批量插入 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entities"></param> public virtual void BulkInsert<T>(List<T> entities) { //由子類實現 } }
再定義SQLRepository、MySQLRepository來繼承Repository並實現BulkInsert方法
public class SQLRepository<T> :Repository<T> where T:class { public override void BulkInsert<T>(List<T> entities) { // 可以直接利用sql語句執行,(不同的資料庫sql執行不一樣) } }
public class MySQLRepository<T> :Repository<T> where T:class { public override void BulkInsert<T>(List<T> entities) { // 可以直接利用sql語句執行,(不同的資料庫sql執行不一樣) } }
上端調用
以上只是模擬CRUD操作,如果真實場景可以看我這篇文章,針對EFCore封裝https://www.cnblogs.com/lxshwyan/p/10794412.html