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