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)能够灵活应对子步骤的变化,符合开放闭合原则。

posted @ 2017-11-20 17:50  cklovefan  阅读(788)  评论(0编辑  收藏  举报