在做第一次機房收費系統中。有一項非常令人頭疼的事情,那就是暫時使用者的問題,在結賬的時候,我們需要考慮該使用者是固定使用者還是暫時使用者,原來在用vb6.0做的時候,假設我們實現了這個功能,那麼在**中會出現非常多的if....else 語句,同一時候。我們必需要呼叫資料設定視窗中的資料。這種話,會非常麻煩,寫出來的**也會非常亂,現在學習了設計模式。我們能夠利用策略模式來實現對不同使用者的消費金額進行計算。
將不同的型別使用者所用到的不同演算法封裝到子類中去,同一時候與簡單工廠結合起來,來實現對不同子類的例項化。這樣在非常大程度上實現了解耦,同一時候降低了我們u層**的壓力。
詳細實現例如以下:
策略模式中的context類,在這個類中要宣告我們所須要賦值和使用的引數,同一時候定義乙個簡單工廠的函式來實現對不同子類的例項化。
public class countcontext
dim cs as countsuper '宣告乙個countsuper物件
'宣告必要的引數屬性
'消費時間屬性
private allconsume_time as decimal
public property allconsumetime as decimal
set(value as decimal)
allconsume_time = value
end set
getreturn allconsume_time
end get
end property
''' ''' 固定使用者一小時費用
'''
'''
private fixuser_cashone as decimal
public property fixusercashone as decimal
set(value as decimal)
fixuser_cashone = value
end set
getreturn fixuser_cashone
end get
end property
''' ''' 暫時使用者半小時費用
'''
'''
private tempuser_cashhalf as decimal
public property tempusercashhalf as decimal
set(value as decimal)
tempuser_cashhalf = value
end set
getreturn tempuser_cashhalf
end get
end property
''' ''' 總共消費金額
'''
'''
private allcash_count as decimal
public property allcashcount as decimal
set(value as decimal)
allcash_count = value
end set
getreturn allcash_count
end get
end property
public sub countcontext(byval type as string)
select case type
case "固定使用者"
dim cs0 = new fixusercashcount()
cs = cs0
exit select
case "暫時使用者"
dim cs1 = new tempusercashcount()
cs = cs1
exit select
end select
end sub
'宣告方法來讓詳細子類物件去執行詳細的函式
public sub countallcash() '供client呼叫的方法
cs.cashcount(me) '返回消費總金額
end sub
end class
策略模式中的抽象類:抽象類實現了對不同子類的封裝,是子類繼承父類。實現多型。
在這裡抽象類中定義乙個提供計算消費金額的抽象乙個方法。
public mustinherit class countsuper
''' ''' 此為策略模式中用到的計算金額的抽象類
'''
''' countcontext物件
'''
public mustoverride sub cashcount(byval count as countcontext)
end class
子類:inherit countsuper
固定使用者子類
public class fixusercashcount : inherits countsuper
public overrides sub cashcount(count as countcontext)
'計算消費總金額
count.allcashcount = -int(-(count.allconsumetime / 60)) * count.fixusercashone 』實現父類的方法
end sub
end class
暫時使用者子類:
public class tempusercashcount : inherits countsuper
public overrides sub cashcount(count as countcontext)
count.allcashcount = -int(-(count.allconsumetime / 30)) * count.tempusercashhalf
end sub
end class
以上是在b層實現的各個方法,經過這些工作後。我們在u層僅僅須要為context中須要的各個引數賦值後。直接呼叫當中的countallcash()方法就可以。
原來做過通過狀態模式計算學生的消費時間。這兩個模式確實非常像。它們從外表看類圖是一
模一樣的,僅僅是狀態模式在各個子類中要指明下乙個執行的子類。二者本質上沒有太大差別。
剛剛經過了設計模式的討論會,我們知道策略模式是一種最基礎的模式,它當中涉及到的關係非常普遍,僅僅包含了乙個聚合和乙個繼承,而這兩種關係也是我們設計模式中最經常使用的的,最核心的兩種關係,通過原來的討論我們發現非常多的模式都能夠通過轉換而形成策略模式,所以掌握好策略模式對學習其它的設計模式還是非常必要的。
機房重構 策略模式
剛開始學習策略模式的時候雖然書是看懂了但是有乙個問題就是不知道如何去實際的應用,通過機房重構中下機消費金額的計算懂得了如何的去使用這個策略模式。它定義了演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變法,不會影響到使用演算法的客戶。dim cashsuper as bc cash...
機房重構 下機 職責鏈模式 策略模式(理論篇)
第一次機房收費系統的時候,我們側重於功能的實現,對於大範圍的使用if.else,沒有太明顯的感覺。可當我們學完設計模式之後,才發現原來多次使用if.else,會使程式產生很高的耦合性,不便修改。對於同樣的下機內容,我們除了要用到七層的知識,可能最大的收穫就是去學習如何把設計模式運用到實踐中去了。1 ...
機房重構 上下機(職責鏈模式和策略模式)
機房重構中上機功能相對好實現一些,下機用到了職責鏈模式和策略模式,職責鏈模式算時間,策略模式算消費金額 部分 dal層 public class offdal ioffidal string sql select from card where cardno cardno datatable tab...