设计模式是软件开发中常用的一种解决特定问题的方案。很多时候,在编写代码时会不自觉地使用到这些模式,但提前了解它们可以帮助避免重复造轮子。本文将通过一个实际项目案例,介绍模板设计模式的应用,以及如何通过模板模式来重用ADO.NET基础代码,提高代码的复用性和可维护性。
设计模式无处不在,它们以不同的形式存在于代码中。通过阅读本文系列,可以逐步学习C#设计模式,并结合项目实践加深理解。
让先来理解一下问题。如果查看下面的ADO.NET数据访问层代码,它是用来将“Customer”对象添加到数据库中的。从代码中可以看出,执行了以下步骤:
分析上述代码,可以看到以下共同点:
那么,问题来了,如何重用连接对象和步骤顺序,当为其他对象如“Customer”、“Supplier”等创建数据访问层时?
首先,可以创建一个包含上述共同点的基类,即步骤顺序和打开关闭连接的公共代码。
public class BaseDataLayer
{
public void Open()
{
// 打开连接的代码
}
public void Close()
{
// 关闭连接的代码
}
public void ExecuteSql()
{
// 执行SQL的代码
}
public void Execute()
{
Open();
ExecuteSql();
Close();
}
}
如果想要添加供应商、账户和其他不同类型的实体,需要更多的这样的基类,这显然不是一个好设计。
为了避免为多种实体类型创建多个基类,让使基类“泛型”。如果对泛型不熟悉,认为泛型只是泛型集合,那么应该看一下这个C#泛型视频。
在下面的代码中,基类现在是泛型的,并且可以用任何实体类型来使用。不需要为不同的类型创建不同的基类。
现在,上述类定义了步骤顺序和公共连接代码,但SQL对于不同的实体是不同的。这意味着这个类是一个半定义的类。因此,表示这种类的一个好方法是通过使这个类“抽象”和“ExecuteSql”方法“抽象方法”。
通过使这个类抽象,没有人可以创建这个类的实例,通过定义“ExecuteSql”方法为抽象,子类必须在下面的子类中定义这个方法。
为了使子类能够编写SQL并执行它们,需要暴露连接和命令对象。因此,可以看到连接和命令对象被设置为受保护的。
“Open”和“Close”方法只能通过“Execute”方法调用,并且也要按照特定的顺序和顺序调用。因此,使这些方法公开将是有害的,因为它们可以在不遵循该顺序的情况下被调用。因此,使这些方法私有可以防止这种调用。
现在基抽象泛型类已经完成,可以从这个半定义的类继承并附加域类。
如果想为customer实体编写CRUD操作,将继承并附加类到泛型抽象类,并编写CRUD逻辑。
public class CustomerDal : AbstractDal
{
public override void ExecuteSql(Customer obj)
{
// 执行SQL的代码
}
}
对于supplier类和其他任何类型的实体类,也可以这样做。
模板模式属于行为模式类别。模板模式定义了一个主过程模板,这个主过程模板以固定的顺序调用子过程(Open、Execute和Close)。这个顺序不能更改。
后来,子过程可以通过继承来扩展,以创建不同类型的过程。
四年前,写了一篇关于模板设计模式的六种其他有用场景的博客。可以从这里了解更多。
场景1:灵活可扩展的通用专业化用户界面
场景2:ASP.NET页面生命周期
场景3:代码生成器
场景4:XML解析器
场景5:业务组件中的验证
场景6:可定制的日志工具
为了进一步阅读,请观看以下面试准备视频和逐步视频系列。
C#设计模式逐步教程
C#面试问题及答案
ASP.NET MVC面试问题及答案
Angular面试问题及答案
逐步学习Azure
逐步学习SQL Server
C#Is与As关键字
C#Throw与Throw ex
C#并发与并行