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