1. 程式人生 > >設計模式之模版方法

設計模式之模版方法

ride 行為型 htm pub entity 數據 一個 div type

在前面大致講了設計模式六大原則及三大模型(行為型、創建型、結構型)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

設計模式之模版方法