首页 > 代码库 > 简单工厂+策略模式-上

简单工厂+策略模式-上


            这次写了一个简单工厂加策略模式、写的糊里糊涂的、主要实现了这么个功能、输入相应的字符串、输入相应的几个数、自动选择算法。以后到上下机、是想输入时间和相应的数据、自动算出相应的钱数。


            故事:富兰克林去黑煤窑干苦力哭、嘿咻、嘿咻、累了一天又一天、节假日也不休息、富兰克林跟老板说、老板你每天让我干活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——————————