在软件开发中,使用三层架构可以更好地管理我们的代码,将业务逻辑和数据访问分开,使得程序易于扩展和维护。本文将介绍如何使用 Delphi 实现一个简单的三层架构程序。
一、什么是三层架构?
三层架构是一种常用的软件架构模式,它将整个系统分为三个层次,每个层次专注于自己的任务,层次之间通过明确定义的接口进行通信。
三层架构包含以下三个层次:
1. 表现层(Presentation Layer):这一层是用户与系统交互的界面,通常是图形用户界面(GUI)或者网页界面。
2. 业务逻辑层(Business Logic Layer):这一层是系统的主要逻辑部分,通常包含所有的业务逻辑。这一层通常不直接访问数据库,而是通过数据访问层进行访问。
3. 数据访问层(Data Access Layer):这一层主要负责与数据库交互,包含所有的数据库访问逻辑和存储过程。
通过将系统分为三个层次,我们可以更好地管理代码,提高系统的可扩展性和可维护性。下面我们来看看如何使用 Delphi 实现一个简单的三层架构程序。
二、使用 Delphi 实现三层架构程序
我们将使用 Delphi 10.4 进行开发,并使用 FireDAC 进行数据库访问。下面是程序的基本结构:
1. 表现层(Presentation Layer)
我们使用 Delphi 的 VCL 库来实现表现层,可以通过拖拽控件的方式快速构建界面。我们的界面主要包含一个 TListBox 控件和一些基本的按钮,用于显示数据和操作数据。
2. 业务逻辑层(Business Logic Layer)
我们使用一个单独的单元来实现业务逻辑层,包含以下函数和过程:
1) LoadData:该函数负责从数据访问层加载数据,并返回一个 TList 2) AddPerson:该过程负责向数据访问层添加新的人员记录,并更新界面上的列表。该过程也不应该直接访问数据库,而应该通过数据访问层进行访问。 3) DeletePerson:该过程负责从数据访问层删除人员记录,并更新界面上的列表。同样也应该通过数据访问层进行访问。 4) UpdatePerson:该过程负责更新数据访问层中的人员记录,并更新界面上的列表。同样也应该通过数据访问层进行访问。 3. 数据访问层(Data Access Layer) 我们使用一个单独的单元来实现数据访问层,包含以下函数和过程: 1) LoadData:该函数负责从数据库中加载人员数据,并返回一个 TList 2) AddPerson:该过程负责向数据库中添加新的人员记录。可以使用 TFDQuery 的 ExecSQL 方法执行 SQL 插入语句来实现。添加成功后,需要重新调用 LoadData 方法来更新列表。 3) DeletePerson:该过程负责从数据库中删除人员记录。可以使用 TFDQuery 的 ExecSQL 方法执行 SQL 删除语句来实现。删除成功后,也需要重新调用 LoadData 方法来更新列表。 4) UpdatePerson:该过程负责更新数据库中的人员记录。可以使用 TFDQuery 的 ExecSQL 方法执行 SQL 更新语句来实现。更新成功后,也需要重新调用 LoadData 方法来更新列表。 当然,上面的过程和函数只是一个简单的例子,实际的程序中可能需要更多的处理和逻辑。我们可以根据实际需求来添加更多的过程和函数。 三、案例说明 下面是我们的程序界面: ![image](https://user-images.githubusercontent.com/8468571/132090021-35497f67-0449-45b8-94af-b49962e53a08.png) 我们可以通过下面的代码来实现对界面的初始化和事件响应: ```delphi unit Main; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.ListBox, BusinessLogic; type TfrmMain = class(TForm) lbPersonList: TListBox; btnAdd: TButton; btnDelete: TButton; btnUpdate: TButton; procedure FormCreate(Sender: TObject); procedure btnAddClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); procedure btnUpdateClick(Sender: TObject); private FPersonList: TList FBusinessLogic: TBusinessLogic; procedure LoadData; procedure UpdateUI; public { Public declarations } end; var frmMain: TfrmMain; implementation {$R *.fmx} procedure TfrmMain.FormCreate(Sender: TObject); begin FBusinessLogic := TBusinessLogic.Create; FPersonList := TList LoadData; end; procedure TfrmMain.LoadData; begin FPersonList.Free; FPersonList := FBusinessLogic.LoadData; UpdateUI; end; procedure TfrmMain.UpdateUI; var i: Integer; begin lbPersonList.Clear; for i := 0 to FPersonList.Count - 1 do begin lbPersonList.Items.Add(FPersonList[i].Name + ' (' + FPersonList[i].Gender + ')'); end; end; procedure TfrmMain.btnAddClick(Sender: TObject); begin FBusinessLogic.AddPerson; LoadData; end; procedure TfrmMain.btnDeleteClick(Sender: TObject); var i: Integer; begin i := lbPersonList.ItemIndex; if i >= 0 then begin FBusinessLogic.DeletePerson(FPersonList[i].Id); LoadData; end; end; procedure TfrmMain.btnUpdateClick(Sender: TObject); var i: Integer; begin i := lbPersonList.ItemIndex; if i >= 0 then begin FBusinessLogic.UpdatePerson(FPersonList[i].Id); LoadData; end; end; end. ``` 在上面的代码中,我们使用 TListBox 控件来显示人员列表,通过 TBusinessLogic 来进行数据操作。下面是 TBusinessLogic 的代码实现: ```delphi unit BusinessLogic; interface uses SysUtils, Classes, DataAccess; type TPerson = record Id: Integer; Name: string; Gender: string; end; TBusinessLogic = class public function LoadData: TList procedure AddPerson; procedure DeletePerson(AId: Integer); procedure UpdatePerson(AId: Integer); end; implementation { TBusinessLogic } procedure TBusinessLogic.AddPerson; begin inherited; DataAccess.AddPerson; end; procedure TBusinessLogic.DeletePerson(AId: Integer); begin inherited; DataAccess.DeletePerson(AId); end; function TBusinessLogic.LoadData: TList var lst: TList begin inherited; lst := DataAccess.LoadData; Result := lst; end; procedure TBusinessLogic.UpdatePerson(AId: Integer); begin inherited; DataAccess.UpdatePerson(AId); end; end. ``` 在上面的代码中,我们使用 TList ```delphi unit DataAccess; interface uses SysUtils, Classes, FireDAC.Comp.Client, FireDAC.Stan.Param; type TPerson = record Id: Integer; Name: string; Gender: string; end; TDataAccess = class public class function LoadData: TList class procedure AddPerson; class procedure DeletePerson(AId: Integer); class procedure UpdatePerson(AId: Integer); end; const strConn = 'DriverID=SQLite;Database=test.db;'; implementation { TDataAccess } class procedure TDataAccess.AddPerson; var qry: TFDQuery; begin qry := TFDQuery.Create(nil); try qry.Connection := TFDConnection.Create(nil); qry.Connection.Params.DriverID := 'SQLite'; qry.Connection.Params.Database := 'test.db'; qry.Connection.LoginPrompt := False; qry. SQL.Text := 'INSERT INTO Person (Name, Gender) VALUES (:Name, :Gender)'; qry.ParamByName('Name').AsString := 'New Person'; qry.ParamByName('Gender').AsString := 'Male'; qry.ExecSQL; finally qry.Free; end; end; class procedure TDataAccess.DeletePerson(AId: Integer); var qry: TFDQuery; begin qry := TFDQuery.Create(nil); try qry.Connection := TFDConnection.Create(nil); qry.Connection.Params.DriverID := 'SQLite'; qry.Connection.Params.Database := 'test.db'; qry.Connection.LoginPrompt := False; qry.SQL.Text := 'DELETE FROM Person WHERE Id = :Id'; qry.ParamByName('Id').AsInteger := AId; qry.ExecSQL; finally qry.Free; end; end; class function TDataAccess.LoadData: TList var qry: TFDQuery; begin Result := TList qry := TFDQuery.Create(nil); try qry.Connection := TFDConnection.Create(nil); qry.Connection.Params.DriverID := 'SQLite'; qry.Connection.Params.Database := 'test.db'; qry.Connection.LoginPrompt := False; qry.SQL.Text := 'SELECT * FROM Person'; qry.Open; while not qry.Eof do begin Result.Add(TPerson.Create); Result.Last.Id := qry.FieldByName('Id').AsInteger; Result.Last.Name := qry.FieldByName('Name').AsString; Result.Last.Gender := qry.FieldByName('Gender').AsString; qry.Next; end; finally qry.Free; end; end; class procedure TDataAccess.UpdatePerson(AId: Integer); var qry: TFDQuery; begin qry := TFDQuery.Create(nil); try qry.Connection := TFDConnection.Create(nil); qry.Connection.Params.DriverID := 'SQLite'; qry.Connection.Params.Database := 'test.db'; qry.Connection.LoginPrompt := False; qry.SQL.Text := 'UPDATE Person SET Name = :Name, Gender = :Gender WHERE Id = :Id'; qry.ParamByName('Id').AsInteger := AId; qry.ParamByName('Name').AsString := 'Updated Person'; qry.ParamByName('Gender').AsString := 'Female'; qry.ExecSQL; finally qry.Free; end; end; end. ``` 在上面的代码中,我们使用 FireDAC 的 TFDQuery 来进行数据库访问,并将结果装载到 TList ```sql CREATE TABLE IF NOT EXISTS `Person` ( `Id` INTEGER PRIMARY KEY AUTOINCREMENT, `Name` TEXT, `Gender` TEXT ); ``` 四、运行效果 运行程序后,我们可以看到一个空的列表和三个按钮,我们点击 Add 按钮可以在列表中添加一个新的记录。我们可以双击列表中的记录,然后点击 Update 按钮,将记录更新后重新加载列表。点击 Delete 按钮可以删除列表中的选定记录。 ![image](https://user-images.githubusercontent.com/8468571/132090106-06e22b64-10ea-4a5a-912b-823f5d89b377.png) 以上就是如何使用 Delphi 实现一个简单的三层架构程序的全部内容。本文的示例可以运行在 Windows 平台上,读者可以根据自己的需要进行修改和扩展。 如果你喜欢我们三七知识分享网站的文章,
欢迎您分享或收藏知识分享网站文章
欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复