• 设计模式之模版方法


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

  • 相关阅读:
    共享无法访问问题,通过ip地址或者主机名无法访问目的主机
    开机系统更新,一直停在?%处,无法进入系统
    win7电脑访问内网地址报错0x800704cf,0x80070035解决方法
    电脑共享--问题汇总
    win10域账户用户时间无法和域服务器同步
    卸载WPS后,原office出现各种问题,报错,图标混乱
    局域网新装电脑主机网络断断连连解决方案
    win10主机无法进入本地共享,“没有权限”
    win10安装部分软件报错“应用程序无法启动,应用程序并行配置不正确,或使用命令行sxstrace.exe”
    【日常修机】打印机故障维护
  • 原文地址:https://www.cnblogs.com/lxshwyan/p/10794791.html
Copyright © 2020-2023  润新知