机房收费系统上下机之观察者模式的尝试

如果读者想在本篇文章中看到观察者模式的巧妙应用,大概有些不可能了。因为这里我只是想把自己的一种思路展现给大家,然后和大家探讨。

背景

在敲机房收费系统的过程中,都是别人说可能会用到什么模式,然后自己针对这些模式进行思考,然后去模仿书中的例子去用。

这不,师姐说上下机这里能用观察者模式,然后我就琢磨了一番,只是收获不是很丰硕,貌似也和师姐讲课中的设想不一样。

我在琢磨使用观察者模式时,已经把系统中和上下机有关的功能实现了。只是在写代码的过程中发现,每次下机,都需要先把正在上机的卡的上机信息查出来(上机时间),然后再更新上下机记录。而且,咱们的系统中有三个地方可以实现下机:主窗体上的下机,选中学生下机,全部学生下机。它们中都有重复的过程。

想法:

每次单击上机按钮时,就实例化一个Observer类,把该卡的上机信息(卡号,卡类型(固定/临时),上机时间)保存到该对象中,然后在另一个Subject类中有一个泛型集合,只要上机成功,就在List中添加一个Observer类,这样Subject中保存所有的上机的卡对象。

点击下机按钮时或选中学生下机时,就更改Subject的状态,并调用Subject的Notify方法,通知要下机的观察者更新。

类图:

代码:

  • 主题Subject

Public Class OffLineSubject
    '添加一个观察者的泛型集合
    Private onlineObservers As New List(Of OnLineObserver)

    Private Shared offlineSubject As OffLineSubject
    Private Sub New()

    End Sub
    ''' <summary>
    ''' 单例模式的应用,保证程序中只有一个OffLineSubject的实例
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetSubjectInstance() As OffLineSubject
        If offlineSubject Is Nothing Then
            offlineSubject = New OffLineSubject
        End If
        Return offlineSubject
    End Function

    '下机日期
    Private _offDate As Date
    Public Property OffDate() As Date
        Get
            Return _offDate
        End Get
        Set(ByVal value As Date)
            _offDate = value
        End Set
    End Property
    '下机时间
    Private _offTime As TimeSpan
    Public Property OffTime() As TimeSpan
        Get
            Return _offTime
        End Get
        Set(ByVal value As TimeSpan)
            _offTime = value
        End Set
    End Property
    '下机方式
    Private _offWay As String
    Public Property OffWay() As String
        Get
            Return _offWay
        End Get
        Set(ByVal value As String)
            _offWay = value
        End Set
    End Property
    '增加上机观察者
    Sub Attach(ByVal onlineObserver As OnLineObserver)
        onlineObservers.Add(onlineObserver)

    End Sub
    '减少上机观察者
    Sub Detach(ByVal onlineObserver As OnLineObserver)
        onlineObservers.Remove(onlineObserver)

    End Sub
    '通知上机观察者,根据上机的卡的卡号来确定具体通知那个上机观察者
    Sub Notify(ByVal key As String)
        Dim i As Integer
        For i = 0 To onlineObservers.Count - 1
            If onlineObservers.Item(i).CardID = key Then
                onlineObservers.Item(i).Update()
            End If
        Next
    End Sub

End Class
  • 观察者Observer

Public Class OnLineObserver

    '添加一个通知者的引用
    Private offSubject As OffLineSubject

    Sub New(ByVal offSubject As OffLineSubject)
        Me.offSubject = offSubject
    End Sub
    Private _cardID As String
    Public Property CardID() As String
        Get
            Return _cardID
        End Get
        Set(ByVal value As String)
            _cardID = value
        End Set
    End Property

    Private _cardType As String
    Public Property CardType() As String
        Get
            Return _cardType
        End Get
        Set(ByVal value As String)
            _cardType = value
        End Set
    End Property

    Private _onTime As TimeSpan
    Public Property OnTime() As TimeSpan
        Get
            Return _onTime
        End Get
        Set(ByVal value As TimeSpan)
            _onTime = value
        End Set
    End Property

    Sub Update()
        Dim enOnOffLineRecord As New Entity.OnOffLineRecordEntity
        Dim bllOnOffLineRecord As New BLL.OnOffLineRecordBLL
        '获得通知者的一些属性(下机方式,下机日期和下机时间)
        enOnOffLineRecord.OffWay = offSubject.OffWay
        enOnOffLineRecord.OffDate = offSubject.OffDate
        enOnOffLineRecord.OffTime = offSubject.OffTime
        '调用策略模式计算消费金额,略
        '……
        '……
        '更新上下机记录
        bllOnOffLineRecord.UpdateOnOffLineRecordBLL(enOnOffLineRecord)

    End Sub

End Class
  • Function OnLine(Byval enCardInfo as Entity.CardInfoEntity)as Boolean

Dim onObserver As OnLineObserver
        Dim systemDate As DateTime = DateTime.Now
        Dim offSubject As OffLineSubject
        '获取唯一的主题通知者实例
        offSubject = OffLineSubject.GetSubjectInstance
        onObserver = New OnLineObserver(offSubject)
        '将上机信息封装
        onObserver.CardID = enCardInfo.CardID
        onObserver.CardType = enCardInfo.CardType
        onObserver.OnTime = systemDate.TimeOfDay
        '在通知者中添加一个观察者
        offSubject.Attach(onObserver)
  • Function OffLine(Byval enCardInfo as Entity.CardInfoEntity) as Boolean

Dim offSubject As OffLineSubject
        offSubject = OffLineSubject.GetSubjectInstance
        offSubject.OffWay = "正常下机"
        'offSubject .OffDate =""
        'offSubject .OffTime =""
        '通知下机
        offSubject.Notify(enCardInfo.CardID)

以上是我的一个初步设想,但是不知道在程序运行中对内存的消耗的影响,已经在不同的机子上上下机这样是否真的可行。有待进一步的学习和思考。

机房收费系统上下机之观察者模式的尝试,布布扣,bubuko.com

时间: 2024-08-05 02:51:28

机房收费系统上下机之观察者模式的尝试的相关文章

机房收费系统学生下机结账小结

这几天一直在考虑机房收费系统学生下机操作.学生下机,一则须要加入学生下机记录信息:还须要计算学生在整 个上机过程中所花费的金额,而且更新学生剩余金额.那么如何做在性能上或者扩展上更好一些呢? 操作 1.加入学生下机信息 2.计算学生上机时间 3.依据上机时间来计算学生所花费的金额 4.更新学生的剩余金额 设计模式 在通过学生上机时间来计算学生所花费的金额这步操作上,须要进行一些条件分支语句的推断.由于上机时间被分为 了三部分:准备时间.至少上机时间.上机时间.所以在步骤3中有大量的条件分支语句,

机房收费系统之下机完整版

前篇博客只是简单的说了下,机房收费系统下机的简单思路,下面来正式的介绍下整个流程. 分析 由于下机的时候需要涉及到两个表中的数值--StudentInfo表和OnlineInfo表,那么我们的思路就是如何能够简化查 询的操作. 学生表中包含的学生的静态信息,而上机信息表中则包含了有关学生上机的所有的信息. 流程 1.更新学生下机信息 2.触发器触发后,会自动的更新学生的消费时间,消费金额并更新学生余额 3.两张表联合查询有关界面上的所有信息 4.为所有的文本框赋值 注意:其实最有意思的就是触发器

有关机房收费系统学生下机的思考

?? 所谓的专家,就是在一个非常小的领域把全部的错误都犯过的人 ---------题记 做机房收费系统也有一段时间了,眼下已经进行到学生下机操作了. 由于学生下机操作时.须要依据不同用户的类别.来进行对应的结账服务.于是乎就想到了曾经学习到的设计模式,那么针对这个问题.能够用到那些模式呢?小编在这里总结一下.(可能有些模式过于勉强,但这都无所谓,学习的真谛就在于此,不断的反复和实验) --------------------------------------------------------

机房收费系统——视图的运用

对于视图在一年前的数据库学习和自考中就学到了,那时只是理论学习,这次在机房收费系统重构中亲自实践,加深了对视图的理解. 定义: 从数据库系统外部来看,视图是用户从一个特定的角度来查看数据库中的数据.从数据库系统内部来看,视图是由SELECT语句组成的查询定义的虚拟表,在数据库中并不真实存在.好比在提高班有学术部,安全部,纪律部等等,这些部门就是视图,需要给哪个部门开会就通知哪个部门.这些部门的人都是提高班各个期的(基本表),并且每个人都是独一无二的. 操作: 由于视图只是存储的SQL Selec

机房收费系统合作版(一)——框架搭建

机房收费系统的合作版中首次尝试使用框架:三层 + Spring.NET +Nhibernet框架. 一.整体框架图如下: 二.三层架构图如下: DAL层: Adapter: 结构: 实现IRepositoryDAL接口:扩展 继承RepositoryBaseDAL父类:复用 功能: 操作类:封装基本的操作--增删改查 this.HibernateTemplate.Save(entity) this.HibernateTemplate.Delete(entity) this.HibernateTe

职责链模式——机房收费系统下机结账

在机房收费系统中,学生下机结账最让人头疼了.因为学生的消费时间(下机时间-上机时间-上机准备时间)有三种情况: 1.消费时间<=0,也就是下机时间与上机时间的间隔在上机准备时间范围内,这种情况是不收费的. 2.消费时间<=最少上机时间,这种情况下消费时间按照最少上机时间收费. 3.消费时间>最少上机时间,这种情况还要考虑递增单位时间.比如递增单位时间是10分钟,消费时间是42分 钟,42/10=4.....2,这种情况要按照50分钟收费. 以上消费时间就分了三种情况,更复杂的是第二种和第

机房收费系统总结

经过二十天的艰苦奋斗我的机房收费系统终于敲完了,在回家之前又让师傅验收了一边终于通过,自己当时感觉那叫一个兴奋呀,终于可以高高兴兴回家了,太好了.当时兴奋过头导致没有写总结,以致回到家后才写总结. 我在做机房收费系统时,感觉最让人头疼的就是结账.算钱,虽然自己是个理科生,可是这算账真不敢恭维,那真叫个一塌糊涂,怎么都算不清楚.那时真的想找块豆腐去撞一下,把自己给撞清醒了.不过好在最后终于做出来,当时感觉世界瞬间就亮了. 其实在做完机房收费系统,最大的感受就是要理清自己的思路,无论是结账还是上下机

机房收费系统——数据库设计说明书

GB8567--88 数据库设计说明书 1      引言 优质数据库在处理大数据的程序或系统中是有非常重要的作用的,所以对于数据库的设计有很多的要求和规定.首先数据库要有很好的可维护性.灵活性,并且数据库的算法逻辑性也要有一定的优化性,这样可以对资源进行有效利用,并且处理数据的时间也会缩短. 1.1   编写目的 由于上机的人越来越多,产生的上机数据越来越多,原始的保存方式已经不能满足数据存储的需要,所以使用数据库对各种记录进行存储.并且数据库可以节省很多的资源,如人力.时间.空间等. 数据库

VB.NET机房收费系统总结

总感觉这次机房收费系统很有份量,一直没有下手总结,从2014-7-27至2014-9-29,这中间有太多故事和成长.首先说一下两次机房收费系统的不同,它是我们从面向过程向面向对象的一个转变,在.NET平台下开发,采用三层思想,并添加了一些设计模式,然后说一下我的变化,不管从思想还是技术上绝对是一笔财富,经过这次机房收费系统,我更加坚信两句话:"出来混迟早都要还的""一切都会过去的". 这次个人重构:7.27-8.11(画图阶段,其中包括数据设计2天):8.12-9.