生活随笔
收集整理的這篇文章主要介紹了
机房收费系统之抽象工厂篇
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
??? 機(jī)房收費(fèi)系統(tǒng)vb.net個(gè)人版已完成,在此過程中分層的好處在系統(tǒng)的完成過程中得到了很好的體會(huì)。第一遍用的是純?nèi)龑幼龅?#xff0c;這幾天又在此基礎(chǔ)上又重構(gòu)了登錄的demo,加上抽象工廠和配置文件的使用。下面以登錄功能為例,總結(jié)一下我的機(jī)房收費(fèi)系統(tǒng)。
一、下面看一下我的包圖:
????? 可以看到,這張圖是從最基本的三層UI→BLL→DAL加入設(shè)計(jì)模式(抽象工廠)演化而來(lái)的,采用抽象工廠是考慮到日后更換數(shù)據(jù)庫(kù)的方便。
?
二、準(zhǔn)備工作
???????創(chuàng)建數(shù)據(jù)表(課參見實(shí)體類中的代碼)
???????創(chuàng)建相應(yīng)的類庫(kù)和窗體。
???????我用的是vb.net的WidowsApplication來(lái)添加界面;使用類庫(kù)作為其它層的包。
?
三、抽象各層的類
??????? 當(dāng)我們確定了系統(tǒng)的整體架構(gòu),就要從宏觀到微觀的實(shí)現(xiàn)。
3.1 Entity(實(shí)體層)
??????? 數(shù)據(jù)庫(kù)設(shè)計(jì)好了,我們要根據(jù)數(shù)據(jù)庫(kù)中的表抽象實(shí)體類,系統(tǒng)中,實(shí)體類和表基本上是一一對(duì)象的。一個(gè)表映射一個(gè)實(shí)體類,表的字段即為實(shí)體類的屬性。
??????? 實(shí)體層并不屬于三層的任何一層,它是獨(dú)立出來(lái)的一層,可以把它看做是自定義變量的組合,供其它三層使用。
[vb] view plaincopyprint?
Public?Class?UserInfoEntity???#Region?"定義UserInfo表中各個(gè)屬性變量"??????Private?_userName?As?String??????Private?_name?As?String??????Private?_password?As?String??????Private?_userlevel?As?String??????Private?_accountHolder?As?String??????Private?_regDate?As?String??????Private?_regTime?As?String??#End?Region???#Region?"定義數(shù)據(jù)表中各個(gè)字段名常量"??????Private?Const?DBFLELD_USERNAME?=?"userName"??????Private?Const?DBFLELD_NAME?=?"name"??????Private?Const?DBFLELD_PASSWORD?=?"password"??????Private?Const?DBFLELD_USERLEVEL?=?"userLevel"??????Private?Const?DBFLELD_ACCOUNTHOLDER?=?"accountHolder"??????Private?Const?DBFLELD_REGDATE?=?"regDate"??????Private?Const?DBFLELD_TIME?=?"regTime"??#End?Region???#Region?"定義數(shù)據(jù)表中各個(gè)字段參數(shù)變量"??????Public?Const?DBPARAM_USERNAME?=?"@userName"??????Public?Const?DBPARAM_NAME?=?"@name"??????Public?Const?DBPARAM_PASSWORD?=?"@password"??????Public?Const?DBPARAM_USERLEVEL?=?"@userLevel"??????Public?Const?DBPARAM_ACCOUNTHOLDER?=?"@accountHolder"??????Public?Const?DBPARAM_REGDATE?=?"@regDate"??????Public?Const?DBPARAM_TIME?=?"@regTime"??#End?Region??????????????????????????????????????Public?Sub?LoadFromDataRow(ByVal?dr?As?DataRow)??????????userName?=?dr(DBFLELD_USERNAME)??????????name?=?dr(DBFLELD_NAME)??????????password?=?dr(DBFLELD_PASSWORD)??????????userlevel?=?dr(DBFLELD_USERLEVEL)??????????accountHolder?=?dr(DBFLELD_ACCOUNTHOLDER)??????????regDate?=?dr(DBFLELD_REGDATE)??????????regTime?=?dr(DBFLELD_TIME)??????End?Sub???#Region?"填充一條記錄"????????????????????????????????????????????????Public?Overloads?Sub?Fill(ByVal?AuserName?As?String,?ByVal?Apassword?As?String,?ByVal?AuserLevel?As?String)??????????userName?=?AuserName??????????password?=?Apassword??????????userlevel?=?AuserLevel??????End?Sub??#End?Region???#Region?"定義數(shù)據(jù)表中各個(gè)屬性"??????????????????????????????????????????Public?Property?userName()?As?String??????????Get??????????????Return?_userName??????????End?Get??????????Set(ByVal?value?As?String)??????????????_userName?=?value??????????End?Set??????End?Property????????????????????????????????????????????Public?Property?name()?As?String??????????Get??????????????Return?_name??????????End?Get??????????Set(ByVal?value?As?String)??????????????_name?=?value??????????End?Set??????End?Property????????????????????????????????????????????Public?Property?password()?As?String??????????Get??????????????Return?_password??????????End?Get??????????Set(ByVal?value?As?String)??????????????_password?=?value??????????End?Set??????End?Property????????????????????????????????????????????Public?Property?userlevel()?As?String??????????Get??????????????Return?_userlevel??????????End?Get??????????Set(ByVal?value?As?String)??????????????_userlevel?=?value??????????End?Set??????End?Property????????????????????????????????????????????Public?Property?accountHolder()?As?String??????????Get??????????????Return?_accountHolder??????????End?Get??????????Set(ByVal?value?As?String)??????????????_accountHolder?=?value??????????End?Set??????End?Property????????????????????????????????????????????Public?Property?regDate()?As?String??????????Get??????????????Return?_regDate??????????End?Get??????????Set(ByVal?value?As?String)??????????????_regDate?=?value??????????End?Set??????End?Property????????????????????????????????????????????Public?Property?regTime()?As?String??????????Get??????????????Return?_regTime??????????End?Get??????????Set(ByVal?value?As?String)??????????????_regTime?=?value??????????End?Set??????End?Property??#End?Region????End?Class??
?
?????? 下面是配置文件的使用:在窗體層添加新項(xiàng)目→選中打開窗口的左邊的General選項(xiàng)→添加配置文件,(中間部分是需要手動(dòng)添加的)。
[vb] view plaincopyprint?
<?xml?version="1.0"?encoding="utf-8"??>??<configuration>????????<appSettings?>??????????<add?key="connStr"?value?="Data?Source=.;Initial?Catalog=Login;User?ID=sa;Password=123456"/>??????????<add?key?="AssemblyName"?value?="DAL"/>??????????<add?key?="db"?value?="DB"/>??????</appSettings>????????<startup>??????????<supportedRuntime?version="v4.0"?sku=".NETFramework,Version=v4.0,Profile=Client"?/>??????</startup>??</configuration>??
?
3.2 DAL層(數(shù)據(jù)訪問層)
????接下來(lái)我們?cè)倏匆幌聰?shù)據(jù)訪問層(DAL),這一層的主要任務(wù)是直接操作數(shù)據(jù)庫(kù),完成對(duì)數(shù)據(jù)的增刪改查等。這里我們?nèi)匀桓鶕?jù)數(shù)據(jù)表來(lái)抽象DAL層的類,基本上也是一個(gè)表對(duì)應(yīng)一個(gè)類,這樣當(dāng)我們?cè)黾有碌谋?#xff0c;直接增加新的DAL層類就可以,很好地符合了“開閉原則”。
另外,因?yàn)?/span>DAL層的類是直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的類,所以這個(gè)類里封轉(zhuǎn)大都有四種方法:增刪改查。但根據(jù)實(shí)際情況會(huì)有不同的參數(shù),不同的返回值。
?????? 這里添加了接口層IDAL,利用反射和抽象工廠,以防更換數(shù)據(jù)庫(kù)。
3.2.1 接口層IDAL,添加Entity的引用。
[vb] view plaincopyprint?
Imports?Entity????Public?Interface?Iuser??????????????????????????????????????????Function?Check(ByVal?entityUser?As?UserInfoEntity)?As?UserInfoEntity??End?Interface??
?
3.2.2 DAL層實(shí)現(xiàn)IDAL接口
??????? 下面是DAL層下的DataAccess類
??????? 添加Configuration引用時(shí)需從.net子項(xiàng)目中查找,還要添加項(xiàng)目引用Entity和IDAL.
[vb] view plaincopyprint?
??Imports?System.Configuration??Imports?System.Reflection??Imports?System.Data.SqlClient??Imports?Entity??Imports?IDAL????Public?Class?DataAccess???#Region?"連接數(shù)據(jù)庫(kù)"??????Private?ReadOnly?connStr?As?String?=?ConfigurationManager.AppSettings("connStr")????????????????????????????????????Public?Overloads?Function?CreateConn()?As?SqlConnection??????????Return?New?SqlConnection(connStr)??????End?Function??#End?Region???#Region?"關(guān)閉相關(guān)對(duì)象"????????????????????????????????????Public?Sub?Close(ByVal?conn?As?SqlConnection)??????????conn.Close()??????????conn?=?Nothing??????End?Sub??????????????????????????????????????Public?Sub?Close(ByVal?cmd?As?SqlCommand)??????????cmd.Dispose()??????????cmd?=?Nothing??????End?Sub??#End?Region????????????????????????????????????????????????????????Public?Sub?AddSqlParameter(ByVal?cmd?As?SqlCommand,?ByVal?dbParam?As?String,?ByVal?dbType?As?SqlDbType,?ByVal?value?As?Object)??????????Dim?sqlParam?As?SqlParameter?=?New?SqlParameter(dbParam,?dbType)??????????sqlParam.Value?=?value??????????cmd.Parameters.Add(sqlParam)??????End?Sub????End?Class??
?
??????? DAL層下的DBuser類:
??????? 同樣添加項(xiàng)目引用Entity和IDAL.
[vb] view plaincopyprint?
Imports?System.Data.SqlClient??Imports?Entity??Imports?IDAL????Public?Class?DBuser????????????Inherits?DataAccess??????Implements?Iuser????????Public?Function?Check(ByVal?entityUser?As?Entity.UserInfoEntity)?As?UserInfoEntity?Implements?IDAL.Iuser.Check????????????????????Dim?sql?As?String?=?String.Format("select?*?from?userInfo?where?[userName]={0}?and?[password]={1}?and?[userLevel]={2}",?UserInfoEntity.DBPARAM_USERNAME,?UserInfoEntity.DBPARAM_PASSWORD,?UserInfoEntity.DBPARAM_USERLEVEL)??????????Dim?conn?As?SqlConnection?=?CreateConn()??????????Dim?cmd?As?SqlCommand?=?New?SqlCommand(sql,?conn)??????????Dim?sda?As?SqlDataAdapter?=?New?SqlDataAdapter(cmd)??????????Dim?ds?As?New?DataSet??????????????????????AddSqlParameter(cmd,?UserInfoEntity.DBPARAM_USERNAME,?SqlDbType.VarChar,?entityUser.userName)??????????AddSqlParameter(cmd,?UserInfoEntity.DBPARAM_PASSWORD,?SqlDbType.VarChar,?entityUser.password)??????????AddSqlParameter(cmd,?UserInfoEntity.DBPARAM_USERLEVEL,?SqlDbType.VarChar,?entityUser.userlevel)????????????Try??????????????conn.Open()??????????????sda.Fill(ds,?"userInfo")??????????????Dim?dr?As?DataRow?=?ds.Tables("userInfo").Rows(0)??????????????entityUser.LoadFromDataRow(dr)??????????????Return?entityUser??????????Catch?ex?As?Exception??????????????Return?Nothing??????????Finally??????????????Close(cmd)??????????????Close(conn)??????????End?Try??????End?Function??End?Class??
?
????? 抽象工廠+反射+配置文件
[vb] view plaincopyprint?
Imports?System.Configuration??Imports?System.Reflection??Imports?IDAL????Public?Class?Factory???#Region?"配置加反射"??????Private?Shared?ReadOnly?AssemblyName?As?String?=?ConfigurationManager.AppSettings("AssemblyName")??????Private?Shared?ReadOnly?db?As?String?=?ConfigurationManager.AppSettings("db")????????????????????????????????????Public?Shared?Function?CreateUser()?As?Iuser??????????Dim?ClassName?As?String??????????ClassName?=?AssemblyName?+?"."?+?db?+?"user"??????????Return?CType(Assembly.Load(AssemblyName).CreateInstance(ClassName),?Iuser)??????End?Function??#End?Region????End?Class??
3.BLL層(封裝業(yè)務(wù)層):前提添加DAL,IDAL和Entity的引用
[vb] view plaincopyprint?
Imports?IDAL??Imports?Entity??Imports?Factory????Public?Class?BllLogin??????????????????????????????????????????Public?Function?CheckRecord(ByVal?entityUserInfo?As?UserInfoEntity)?As?Boolean??????????Dim?checkResult?As?Boolean????????????????????Dim?iuser?As?Iuser????????????????????iuser?=?Factory.Factory.CreateUser()????????????If?Not?IsNothing(iuser.Check(entityUserInfo))?Then??????????????checkResult?=?True??????????Else??????????????checkResult?=?False??????????End?If????????????Return?checkResult??????End?Function??End?Class??
4.UI層(界面層)
??????? ?界面層的類,就是我們窗體類,又多少個(gè) 窗體,UI層就有多少個(gè)類。
??????? 下面我們看一下登錄窗體類。
[vb] view plaincopyprint?
Imports?BLL??Imports?Entity????Public?Class?frmLogin????????????Private?Sub?btnLogin_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?btnLogin.Click????????????????????If?txtUserID.Text?=?""?Then??????????????MessageBox.Show("用戶名不能為空!")??????????????txtUserID.Focus()??????????????Return??????????End?If????????????If?txtPassword.Text?=?""?Then??????????????MessageBox.Show("用戶名不能為空!")??????????????txtPassword.Focus()??????????????Return??????????End?If??????????????????????Dim?entityUserInfo?As?New?UserInfoEntity??????????entityUserInfo.Fill(Trim(txtUserID.Text),?Trim(txtPassword.Text),?Trim(cboUserLevel.Text))??????????????????????Dim?bllUserInfo?As?New?BllLogin??????????If?bllUserInfo.CheckRecord(entityUserInfo)?Then??????????????Me.Hide()??????????????frmMain.Show()????????????????????????????????????????????????????????????????????Else??????????????MsgBox("登錄失敗",?vbOKOnly?+?vbInformation,?"登錄失敗")??????????????txtUserID.Focus()??????????????Exit?Sub??????????End?If??????End?Sub??????????????Private?Sub?btnCancel_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?btnCancel.Click??????????Me.Close()??????End?Sub????End?Class??
?????
??????? 上面就是我在三層(UI→BLL→DAL)的基礎(chǔ)上加上設(shè)計(jì)模式抽象工程實(shí)現(xiàn)系統(tǒng)登錄的Demo,拿出來(lái)和大家一起分享,其中的不足之處,還希望大家多多指正。
總結(jié)
以上是生活随笔為你收集整理的机房收费系统之抽象工厂篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。