機房收費系統收費制度——策略+簡單工廠模式
前段時間把設計模式學了個遍,確切的說是初識。因為看過后,腦袋里就只剩下這幾個模式叫什么了,怎么用,類圖是什么,都不記得了。
現在機房收費系統重構,剛好拿幾個過來練練手。
## 一、策略模式的使用環境
機房收費系統在下機收費這塊,涉及到兩種卡的收費,一種是固定用戶,一種是臨時用戶。不同的用戶消費單價不相同,導致在讀取數據庫的時候會有兩種不同的查詢方法,這樣的情況適合使用策略模式來解決。(其實這里的情況比較簡單,系統小,用模式有點復雜,這里只是為了學習策略模式和簡單工廠)
## 二、具體實現
Client 類
~~~
'計算收費類
'相當于策略模式中的Client
'定義收費計算公式
Public Class CalculateConsume
'聲明實體類——數據表
Dim dataen As New Model.Data_Table
'聲明實體類對象——消費表
Dim customeren As New Model.Consume_Table
'定義dataaccess 類
Dim da As New DataAccess.DataAccess
'定義收費頻率
Dim frequency As Integer
'定義準備時間
Dim timeready As Integer
'定義最少上機時間
Dim timemin As Integer
'計算公式
'調用ContextConsume類
Public Function CaculateMoney(cardnum As Integer) As Model.Consume_Table
'初始化策略模式配置類
Dim conprice As New ContextConsume(cardnum)
'調用方法,獲取消費單價
Dim unitprice As Integer = conprice.Getresult()
'定義消費金額
Dim costmoney As Integer
'計算消費金額=單價*消費時長
costmoney = unitprice * Interval(GetOnTime(cardnum))
'把計算結果傳值給實體類
customeren.P_cost = costmoney
customeren.P_interval = Interval(GetOnTime(cardnum))
'將(下機)現在時間傳給實體類
customeren.P_offtime = Format(Now, "hh-nn")
Return customeren
End Function
'獲取某個卡的上機時間——被Client 調用
Public Function GetOnTime(cardnnum) As Model.Consume_Table
'創建接口
Dim ico As IDAL.IConsume = da.CreateConsume()
'調用D層方法,并返回
Return ico.GetPOnTime(cardnnum)
End Function
'計算消費時長——把實體類當參數傳遞
Public Function Interval(customeren As Model.Consume_Table) As Long
'把讀取來的上機時間賦值給日期變量
Dim ondate As Date = Format(CDate(customeren.P_ondate), "mm-dd")
Dim ontime As Date = Format(CDate(customeren.P_ontime), "HH-nn")
'以當前時間為結束時間
Dim enddate As Date = Format(Now, "mm-dd")
Dim endtime As Date = Format(Now, "HH-nn")
'調用系統函數 datediff 計算時間間隔
Dim costdate As Long = DateDiff("n", Trim(ondate), Trim(enddate))
Dim costtime As Long = DateDiff("n", Trim(ontime), Trim(endtime))
'調用系統函數cint 四舍五入來求的 時間間隔
'上機時間小于最小上機時間,按30分鐘算
If (costdate + costtime) < timemin & (costdate + costtime) > timeready Then
Interval = 1
Else
'上機時間大于最小上機時間
Interval = CInt((costtime + costdate - timeready) / frequency)
End If
End Function
'取得基本數據表中的數據
Public Function GetData() As Model.Data_Table
'創建接口
Dim id As IDAL.IData = da.CreateData()
'調用D層方法——取得數據
dataen = id.GetData()
'取出收費頻率
frequency = dataen.P_frequency
'取出最少上機時間
timemin = dataen.P_timemin
'取出準備時間
timeready = dataen.P_timeready
'返回值
Return dataen
End Function
End Class
~~~
策略類中接口
~~~
'策略模式
'根據用戶類型,到數據庫中去查詢不同的消費價格
'不同的用戶,實現查詢的語句不同
Public Interface ConsumePrice
'讀取不同用戶的消費價格
Function Getprice() As Integer
End Interface
~~~
配置策略類的context +簡單工廠實現
~~~
'關聯策略模式
'實例化策略模式接口
Public Class ContextConsume
'聲明消費單價類對象——策略模式
Dim cp As IStrategy.ConsumePrice
'構造函數,運用簡單工廠,根據傳入參數確定具體的收費策略
Public Sub New(cardnum As Integer)
'根據參數選擇實例化對象
Select Case Cardtype(cardnum)
Case "臨時用戶"
cp = New TempConsume()
Exit Sub
Case "固定用戶"
cp = New RegularConsume()
Exit Sub
End Select
End Sub
'根據卡類型,獲取收費單價
Public Function Getresult() As Integer
'返回具體方法的實現
Return cp.Getprice()
End Function
'獲取卡的類型
Public Function Cardtype(cardnum As Integer) As String
'聲明dataaccess 類
Dim da As New DataAccess.DataAccess
'創建接口
Dim ic As IDAL.ICards = da.CreateCards()
'返回值
Return ic.GetCardType(cardnum)
End Function
End Class
~~~
實現接口的具體類
~~~
'獲取固定用戶的消費單價
Public Class RegularConsume
Implements IStrategy.ConsumePrice
'獲取固定用戶的消費單價
Public Function Getprice() As Integer Implements IStrategy.ConsumePrice.Getprice
'聲明工廠對象
Dim da As New DataAccess.DataAccess
'創建接口
Dim id As IDAL.IData = da.CreateData
'創建datatable對象
Dim dataen As New Model.Data_Table
'調用D層方法實現
dataen = id.GetPriceRegular()
'取出需要的值,并返回
Return dataen.P_priceregular
End Function
End Class
~~~
臨時用戶
~~~
'獲取臨時用戶的消費價格
Public Class TempConsume
'實現IStrategy接口
Implements IStrategy.ConsumePrice
'獲取臨時用戶的消費價格
Public Function Getprice() As Integer Implements IStrategy.ConsumePrice.Getprice
'聲明工廠對象
Dim da As New DataAccess.DataAccess
'創建接口
Dim id As IDAL.IData = da.CreateData
'創建datatable對象
Dim dataen As New Model.Data_Table
'調用D層方法實現
dataen = id.GetPriceTemp()
'取出需要的值,并返回
Return dataen.P_pricetemp
End Function
End Class
~~~
- 前言
- 抽象工廠——創建型設計模式一
- 工廠三姐妹——創建型設計模式之二
- 初識面向對象設計模式
- 建造者模式——創建型模式之三
- 原型模式——創建型設計模式四
- 適配器 and 組合模式——結構性模式之一
- 橋接模式——結構性設計模式之二
- 組合模式——結構型設計模式之三
- 裝飾模式——結構型設計模式之四
- 外觀模式——結構型設計模式之五
- 代理模式——結構型設計模式之六
- 觀察者模式——行為型設計模式之五
- 模板設計——行為設計模式之一
- 命令模式——行為設計模式之二
- 狀態模式——行為型設計模式之三
- 職責模式——行為設計模式之四
- 中介模式——行為模式之六
- 策略+簡單工廠 實戰篇
- 看觀察者怎么全方位觀察機房收費系統
- 登陸也需要裝飾——機房收費系統裝飾模式實戰
- 何為抽象?你有本末倒置嗎?
- 再回首,策略、簡單工廠是否依然?
- 再回首——行為型設計模式