现在的位置: 首页 > 综合 > 正文

职责链模式—-主界面显示

2013年12月12日 ⁄ 综合 ⁄ 共 4233字 ⁄ 字号 评论关闭

             职责链模式,十多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一个链。并沿着这条链传递该请求,知道有一个对象处理它为止。

         这是对职责链的模式的解释,那么它有什么好处呢?

         1当客户提交一个请求时,请求时沿着链传递直到有一个对象负责处理它。

         2降低了耦合度,接受者和发送者都没有对方的明确的信息,且链中的对象自己也并不知道链的结构。它可以简化对象之间的相互连接,他们仅需保持一个指向其中后继者的引用,而不需要保持它所有的候选接受者的引用。

         3增强了灵活性,可以随时的增加或修改处理一个请求的结构。

下面看一下职责链的结构图:

          在做机房收费系统的时候,希望在自己的系统中用到更多的设计模式,就将此模式加到了我们的主界面显示中。我先做了一个小例子,下面展示一下它的代码。

         首先说说的这个小例子的环境吧,有三盏灯,每次只能亮一盏,发出一条消息后,先后分别经过红灯、绿灯、黄灯,只有一盏灯可以对此消息作出处理。


代码如下:

1主窗体代码:

Public Class frmLight
    ''' <summary>
    ''' 单击确定按钮
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.Click
        If cmbColour.Text = "" Then
            MsgBox("请选择灯", , "提示")
        End If
        Dim functionLight As New FunctionClass
        functionLight.Request(Me.cmbColour.Text)
    End Sub
    ''' <summary>
    ''' 主窗体加载
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub frmLight_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        cmbColour.Items.Add("RED")  '加载
        cmbColour.Items.Add("GREEN")
        cmbColour.Items.Add("YELLOW")
    End Sub
End Class

2  定义请求的类,封装了职责链中链的顺序

''' <summary>
''' 封装请求,设置各类之间的上下级
''' </summary>
''' <remarks></remarks>
Public Class FunctionClass
    ''' <summary>
    ''' 灯亮请求方法
    ''' </summary>
    ''' <param name="colour">灯的名字</param>
    ''' <returns></returns>
    ''' <remarks>接收类,接收那盏灯亮的请求</remarks>
    Public Function Request(ByVal colour As String)
        Dim enRedLight As New RedLight("hong")
        Dim enGreenLight As New GreenLight("lv")
        Dim enYellowLight As New YellowLight("huang")
        enRedLight.SetSuperior(enGreenLight)   '设置上级
        enGreenLight.SetSuperior(enYellowLight) '设置上级 亮灯的请求先经过红灯,然后再经过绿灯,最后进过黄灯
        enRedLight.Play(colour)    '这里我将第一个接受请求的等固定在了程序里,这点很不好。不利于维护,为红灯设置下一级
    End Function
End Class

3定义了对象的抽象类

''' <summary>
''' 定义灯类的抽象类
''' </summary>
''' <remarks></remarks>
Public MustInherit Class Light
    Private name As String    '私有属性,类的name
    Protected superior As Light   '保护属性
    Public Sub New(ByVal LightName As String)  '带参数的实例化自身的方法
        Me.name = LightName
    End Sub
    ''' <summary>
    ''' 设置灯的上级,就是灯的顺序
    ''' </summary>
    ''' <param name="LightSuprior"></param>
    ''' <remarks></remarks>
    Public Sub SetSuperior(ByVal LightSuprior As Light)
        Me.superior = LightSuprior
    End Sub
    ''' <summary>
    '''  '处理请求的抽象方法
    ''' </summary>
    ''' <param name="strColour">具体的请求</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public MustOverride Function Play(ByVal strColour As String)
End Class

4定义了一个具体接收请求的类

''' <summary>
''' 处理请求的具体的类
''' </summary>
''' <remarks></remarks>
Public Class RedLight : Inherits Light
    ''' <summary>
    ''' 带参数的构造函数
    ''' </summary>
    ''' <param name="LightName"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal LightName As String)
        MyBase.New(LightName)
    End Sub
    ''' <summary>
    ''' 处理请求的具体的方法
    ''' </summary>
    ''' <param name="strRed">需要处理的事情</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function Play(ByVal strRed As String)
        If Trim(strRed) = "RED" Then      '对待处理的事情做出判断,看是否能匹配,如果能则红灯亮
            frmLight.btnRed.Visible = True
        Else
            If Not (superior Is Nothing) Then   '如果不能提交到红灯的上一级,绿灯。
                superior.Play(strRed)
            End If
        End If

    End Function



End Class

5定义了一个具体接收请求的类

''' <summary>
''' 处理具体请求的类,继承抽象类Light
''' </summary>
''' <remarks></remarks>
Public Class GreenLight : Inherits Light
    ''' <summary>
    ''' 带参数的构造函数
    ''' </summary>
    ''' <param name="LightName"></param>
    ''' <remarks></remarks>
    Sub New(ByVal LightName As String)
        MyBase.New(LightName)
    End Sub

    ''' <summary>
    ''' 处理具体请求的类
    ''' </summary>
    ''' <param name="strColour">具体的请求</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function Play(strColour As String) As Object
        '对待处理的事情做出判断,看是否能匹配
        '如果能则绿亮
        '如果不能则提交到绿灯的上一级,黄灯
        If Trim(strColour) = "GREEN" Then
            frmLight.btnGreen.Visible = True
        Else
            If Not (superior Is Nothing) Then
                superior.Play(strColour)
            End If
        End If
    End Function
End Class

6定义了一个具体接收请求的类

''' <summary>
''' 处理具体请求的类,继承Light
''' </summary>
''' <remarks></remarks>
Public Class YellowLight : Inherits Light
    ''' <summary>
    ''' 带参数的构造函数,继承抽象类中的构造函数
    ''' </summary>
    ''' <param name="LightName"></param>
    ''' <remarks></remarks>
    Sub New(ByVal LightName As String)
        MyBase.New(LightName)

    End Sub
    ''' <summary>
    ''' 处理请求的具体函数
    ''' </summary>
    ''' <param name="strColour"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function Play(strColour As String) As Object
        '对待处理的事情做出判断,看是否能匹配,如果能则黄灯亮
        '如果不能则给出提示
        If Trim(strColour) = "YELLOW" Then
            frmLight.btnYellow.Visible = True
        Else
            MsgBox("您的请求不合理", , "提示")
            'If Not (superior Is Nothing) Then
            '    MsgBox("您的请求不合理")
            'End If
        End If
    End Function
End Class

总结:

职责链模式的关键就是发出请求与处理请求,每个对象都有权对请求作出处理,但是最后只有一个对象可对请求作出处理,而且请求被处理的路线是有一定级别的。此项请求会沿着这条链一直往前走,直到有一个对象能够处理它为止。


【上篇】
【下篇】

抱歉!评论已关闭.