在前面大致讲了设计模式六大原则及三大模型(行为型、创建型、结构型)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