模板设计模式的应用与实践

设计模式是软件开发中常用的一种解决特定问题的方案。很多时候,在编写代码时会不自觉地使用到这些模式,但提前了解它们可以帮助避免重复造轮子。本文将通过一个实际项目案例,介绍模板设计模式的应用,以及如何通过模板模式来重用ADO.NET基础代码,提高代码的复用性和可维护性。

设计模式简介

设计模式无处不在,它们以不同的形式存在于代码中。通过阅读本文系列,可以逐步学习C#设计模式,并结合项目实践加深理解。

理解问题

让先来理解一下问题。如果查看下面的ADO.NET数据访问层代码,它是用来将“Customer”对象添加到数据库中的。从代码中可以看出,执行了以下步骤:

  • 打开ADO.NET连接并提供连接字符串。
  • 创建命令,编写SQL并执行SQL。
  • 执行完SQL后,关闭连接。

分析上述代码,可以看到以下共同点:

  • 步骤顺序,即打开连接、执行SQL和关闭连接,对于所有ADO.NET调用都是相同的。
  • 打开和关闭连接对象的代码对于所有实体都是相同的。唯一变化的是SQL语句。

那么,问题来了,如何重用连接对象和步骤顺序,当为其他对象如“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#并发与并行

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485