首页 > 代码库 > 简单工厂+策略模式-上
简单工厂+策略模式-上
这次写了一个简单工厂加策略模式、写的糊里糊涂的、主要实现了这么个功能、输入相应的字符串、输入相应的几个数、自动选择算法。以后到上下机、是想输入时间和相应的数据、自动算出相应的钱数。
故事:富兰克林去黑煤窑干苦力、嘿咻、嘿咻、累了一天又一天、节假日也不休息、富兰克林跟老板说、老板你每天让我干活23小时、才给那么点、而且节假日也不给个加班费啥的、龟YEYE不干了= =
老板怕小龟龟走、没人给他拉煤、就给小龟龟出了道难题、如果你能用简单工厂和策略模式写出一个能根据每小时钱数、和小时数算工资的软件、对了、节假日还要有特殊的加成、一点按钮就能算出来、我就按你说的给工钱。
富兰克林:你妹啊、搞IT的就好好搞IT、挖煤作甚、好在龟YEYE学过Design pattern、等着Give Money吧!
经过三天三夜的奋战、富兰克林终于画出了UML图、他找到了搞IT的肉白卡、肉白卡肉白卡、快来看看、这图咋样!
————————哇塞!!!
————————看不懂= =
富兰克林说:@¥#%……#¥@……
(要想知道富兰克林说的是什么、请重新阅读图片前面的内容——)
肉白卡:
哦哦哦!你们那黑心的老板、快给我讲讲、最近我们学校正让做机房收费系统、上下机有好几种算法、搞得GU-NAI-NAI头晕目眩的、看你这个好像能用的上、说说吧!
富兰克林:
看UML图、首先 你要知道有、工厂类、侧略类、算法的抽象类、和算法类
抽象算法类:有一个计算金额的抽象方法、而继承他的子类、也就是实际的算法类重写他的功能、这里我还加入了构造方法、构造方法就是接受要计算的数值、算法1的类是接受2个、算法2的类是接受3个。
策略类:这个类主要有2个方法、一个是传入具体算法类、这里声明了抽象算法类、可以传入他的所有子类、传入之后用策略类声明的一个抽象算法接受、第二个方法使用这个算法类的计算方法、返回算数结果。
工厂类:这个其实就是根据传入的字符串、判断到底实例化哪个计算类、省去了客户端手动NEW类、客户端不用知道实现方式、只要知道想要什么、就跟工厂类说就可以了、工厂类有2个构造方法、一个能接受2个int型的数字、另一个能接受3个int型的数字、分别满足2个算法类计算需要的数字。
富兰克林:小肉肉你懂了没
肉白卡:没懂………………
富兰克林:你不是搞IT的吗?
肉白卡:
哎…………还高IT的呢、马上就要挨踢了、正所谓一瓶子不满半瓶子晃荡、机房收费系统上下机弄不出来、我还当什么程序员、还是回去弹GT吧- -
富兰克林:
小白就是小白、这样吧我把源码给你、你回去研究下、下次去你对象那吃饭、记得打1折!
肉白卡:1折?!那直接请你好了!
富兰克林:好的马上给你代码
''' <summary> ''' 算法抽象列(CashAlgorithm现金算法) ''' </summary> ''' <remarks></remarks> Public MustInherit Class CashAlgorithm ''' <summary> ''' 算现金的抽象方法 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Public Overridable Function countMoney() As Integer End Function '必须被重写 'Public Overrides Sub Move(ByVal NewX As Integer, ByVal NewY As Integer) ' '... 'End Sub 'Public Property XPos() As Integer ' '... 'End Property End Class ''' <summary> ''' 算法1 正常工资 ''' </summary> ''' <remarks></remarks> Public Class CashOne '继承抽象类 Inherits CashAlgorithm Dim _workTime As New Integer Dim _hourMoney As New Integer ''' <summary> ''' 构造函数(因为每个算法有可能传入值不一样) ''' </summary> ''' <param name="workTime"></param> ''' <param name="hourMoney"></param> ''' <remarks></remarks> Sub New(workTime As Integer, hourMoney As Integer) ' TODO: Complete member initialization _workTime = workTime _hourMoney = hourMoney End Sub ''' <summary> ''' 正常工资的算法 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Public Overrides Function countMoney() As Integer Dim money As Integer '定义存放钱的变量 money = _workTime * _HourMoney * 1 '正常工资 Return money '返回计算结果 End Function End Class ''' <summary> ''' 算法2 节假日工资算法 ''' </summary> ''' <remarks></remarks> Public Class CashTwo '继承抽象类 Inherits CashAlgorithm Dim _workTime As New Integer Dim _hourMoney As New Integer Dim _addMoney As New Integer ''' <summary> ''' 构造函数(因为每个算法有可能传入值不一样) ''' </summary> ''' <param name="workTime"></param> ''' <param name="hourMoney"></param> ''' <remarks></remarks> Sub New(workTime As Integer, hourMoney As Integer, addMoney As Integer) ' TODO: Complete member initialization _workTime = workTime _hourMoney = hourMoney _addMoney = addMoney End Sub ''' <summary> ''' 节假日工资的算法 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Public Overrides Function countMoney() As Integer Dim money As Integer '定义存放钱的变量 money = _workTime * _hourMoney + _addMoney '这里是正常工资的2倍 Return money '返回计算结果 End Function End Class ''' <summary> ''' 策略模式类 ''' </summary> ''' <remarks></remarks> Public Class CashContext Private insideCashAlgorithm As CashAlgorithm '声明一个算法抽象类 ''' <summary> ''' 构造方法、接受外部传入的算法类(这里声明抽象算法类、使用他的子类、也就是策略) ''' </summary> ''' <param name="outSideCashAlgorithm"></param> ''' <remarks></remarks> Public Sub CashContext(outSideCashAlgorithm As CashAlgorithm) insideCashAlgorithm = outSideCashAlgorithm End Sub ''' <summary> ''' 使用接受算法的方法、计算出money返值 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Public Function countMoney() As Integer Return insideCashAlgorithm.countMoney() End Function End Class ''' <summary> ''' 简单工厂类 ''' </summary> ''' <remarks></remarks> Public Class CashFactory Dim fCashContext As New CashContext '定义策略 Dim _workTime As New Integer Dim _hourMoney As New Integer Dim _addMoney As New Integer Dim _str As String '《构造函数**************************************************** '让工厂类可以传入葛总不同的值 ''' <summary> ''' 正常上班传入值构造方法 ''' </summary> ''' <param name="str">选择要素string类型 正常上班or假日上班</param> ''' <param name="workTime">工作时间 int型</param> ''' <param name="hourMoney">小时/钱 int型</param> ''' <remarks></remarks> Sub New(str As String, workTime As Integer, hourMoney As Integer) ' TODO: Complete member initialization _workTime = workTime _hourMoney = hourMoney _str = str End Sub ''' <summary> ''' 假日上班传入值构造方法 ''' </summary> ''' <param name="str">选择要素string类型 正常上班or假日上班</param> ''' <param name="workTime">工作时间 int型</param> ''' <param name="hourMoney">小时/钱 int型</param> ''' <param name="addMoney">加班费 int型</param> ''' <remarks></remarks> Sub New(str As String, workTime As Integer, hourMoney As Integer, addMoney As Integer) ' TODO: Complete member initialization _workTime = workTime _hourMoney = hourMoney _addMoney = addMoney _str = str End Sub '构造函数****************************************************》 ''' <summary> ''' 计算钱、选择算法、运算并返回结果 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Function CountMoney() As Integer Select Case (_str) Case "正常上班" fCashContext.CashContext(New CashOne(_workTime, _hourMoney)) Case "假日上班" fCashContext.CashContext(New CashTwo(_workTime, _hourMoney, _addMoney)) Case Else MsgBox("未找到相应算法策略") End Select Return fCashContext.countMoney() '计算法返回结果 End Function End Class ' 客户端 ''' <summary> ''' 正常上班 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim cashFactory As New CashFactory(Button1.Text, txtTime1.Text, txtMoney2.Text) MsgBox(cashFactory.CountMoney()) End Sub ''' <summary> ''' 假日上班 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim cashFactory As New CashFactory(Button2.Text, txtTime1.Text, txtMoney2.Text, txtAddMoney.Text) MsgBox(cashFactory.CountMoney()) End Sub
富兰克林:好啊!!!说定了
第二天………………………………
老板、我做好了、你看
正常上班输入工作时间和每小时工资点击正常上班就可核算工资、二假日上班在输入工作时间和每小时工资的基础上、输入假日补贴、点击假日上班就可以啦!
恩!很好、老板摸了富兰克林的龟头说道、小伙子、前途无量嘛!以后咱们黑煤窑、啊不是、咱们光明煤窑就用你这个软件算工资了!
只见公司老板输入了1 23 1这几个数字………点了2下出现了23 和24两个数字………………恩恩!!!卜错卜错O(∩_∩)O~
富兰克林:
—————————————————这次博客信息量有点多—————————————————
——————————chenchen——————————