zoukankan      html  css  js  c++  java
  • c#设计模式(2)—— 利用模板模式减少重复代码的编写

    1、模板模式概念

      模板方法模式——在抽象类中定义一个操作中的算法骨架,而将一些步骤延迟到子类中去实现。

    2、业务场景

      之前在项目中,写过数据模型,但该数据模型仅能支持sqlserver,如果进行数据库迁移,可能会导致修改代码或新增大量不必要的重复代码,因此,考虑到采用模板模式对部分内容进行重构。

      目前的一个业务场景是,对数据库表进行创建字段的操作,主要包括三个步骤(1)、判断当前字段是否存在于库表中;(2)、如果存在则删除之;(3)如果不存在则直接添加。

      根据模板模式的设计思路,把相同的部分抽象出来到抽象类中去定义(TemplateDataBase),具体子类(sqlserverOperation、mysqlOperation)来实现各自的方法(本实例中,子类均负责处理实体 T 转 字符串数组)。

    3、实际应用

    3.1 抽象类封装公共的操作方法及允许子类可重写的抽象方法

    namespace TemplateDataBaseOperation
    {
        /// <summary>
        /// 定义抽象类
        /// </summary>
        public abstract class TemplateDataBase
        {
            /// <summary>
            /// 定义抽象方法操作数据库字段,用于子类进行重写
            /// </summary>
            public abstract string[] operationColumns<T>(T entity);
    
            /// <summary>
            /// 公共的操作方法
            /// </summary>
            /// <returns></returns>
            public bool operation(string[] columns,string tableName)
            {
                bool ret = false;
                //判断字段是否存在
                if(isColumnExist(columns, tableName)){
                    //删除字段
                    if (dropColumn(columns, tableName))
                    {
                        //创建字段
                        ret = createColumn(columns, tableName);
                    }
                }
                else
                {
                    ret = createColumn(columns, tableName);
                }
                return ret;
            }
            /// <summary>
            /// 判断待操作字段是否存在
            /// </summary>
            /// <returns></returns>
            public bool isColumnExist(string[] columns,string tableName)
            {
                //undo 
                return false;
            }
    
            /// <summary>
            /// 删除已经存在的字段
            /// </summary>
            /// <returns></returns>
            public bool dropColumn(string[] columns,string tableName)
            {
                //undo
                return false;
            }
    
            /// <summary>
            /// 创建字段
            /// </summary>
            /// <returns></returns>
            public bool createColumn(string[] columns,string tableName)
            {
                //undo
                return false;
            }
        }
    }

    3.2 定义子类方法

    namespace TemplateDataBaseOperation
    {
        public class MySqlOperation : TemplateDataBase
        {
            /// <summary>
            /// 返回columns 集合
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="entity"></param>
            /// <returns></returns>
            public override string[] operationColumns<T>(T entity)
            {
                //undo
                return null;
            }
        }
    }
    
    namespace TemplateDataBaseOperation
    {
        public class SqlServerOperation : TemplateDataBase
        {
            /// <summary>
            /// 返回 columns 集合
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="entity"></param>
            public override string[] operationColumns<T>(T entity)
            {
                return null;
            }
        }
    }
    

     3.3 测试类

    namespace TemplateDataBaseOperation
    {
        public class Test
        {
            private static User testUserEntity = new User { Id = 1,UserName = "chenk"};
            /// <summary>
            /// 测试类
            /// </summary>
            /// <param name="args"></param>
            static void main(string[] args)
            {
                SqlServerOperation sqlServerOperation = new SqlServerOperation();
                string[] columns = sqlServerOperation.operationColumns<User>(testUserEntity);
                sqlServerOperation.operation(columns, "User");
            }
        }
    }

    4、优点

    (1) 实现了代码的复用

    (2)能够灵活应对子步骤的变化,符合开放闭合原则。

  • 相关阅读:
    【Nginx】跨域配置
    【Python】【Chart】图标绘制/地图生成
    【Python】操作压缩文件
    【VSCode】koroFileHeader插件自动添加文件及函数注释
    【性能】web页面性能之lighthouse使用
    【VSCode】格式化后换行
    【Python】MD5
    【IDEA】自定义/自动生成/注释/新增文件自动生成注释/自动生成方法注释
    【Java】文件下载/下载Excel/下载文件到本地
    【杂项】英语学习
  • 原文地址:https://www.cnblogs.com/cklovefan/p/7867483.html
Copyright © 2011-2022 走看看