烧水器事件簿 [Design, C#]

0. 目录

  • 1. 烧水器事件
  • 2. 关于 PROTON
  • 3. BOILER
  • 4. ENROLLEE
  • 5. ENROLLEEQUEUE
  • 6. ENROLLEEMANAGER
  • 7. 关于设计

 

1. 烧水器事件

Paul是某公司某部门的员工,该部门的员工都是入住员工宿舍的。员工宿舍提供开水的地方和他们所住的地方相隔较远,于是他们凑钱买了个烧水器,但最近这个烧水器坏了。Paul 打算动员大家再凑钱买一个新的,可大家爱理不理、得过且过的,搞到这几天大家都在楼下的小卖部买矿泉水喝。Paul和同宿舍的几个人商量了,打算就这几个人凑钱买一个烧水器,但东西买回来后,其他人肯定会趁机拿来用,不让其他人用是不可能的,于是,Paul他们打算出台一些规定来维护“股东”们的权益。

以下是他们即将出台的使用烧水器的排队规则:

  • 1) Paul、Henry、Chris 和 MC 四个人凑钱买了这个新的烧水器,他们是“股东”;
  • 2) 当原队列只有“股东”时,后加入的“股东”将排在队列末尾,而后加入的“非股东”也将排在队列末尾;
  • 3) 当原队列只有“非股东”并且第一个“非股东”正在使用烧水器烧水时,后加入的“股东”将插入正在使用烧水器的“非股东”后面、第一个正在等候烧水器的“非股东”前面,而后加入的“非股东”将排在队列末尾;
  • 4) 当原队列既有“股东”又有“非股东”时,后加入的“股东”将会插在队列中最后一个“股东”后面、第一个正在等候烧水器的“非股东”前面。

规则里面的条款明显体现了“股东”们的优先使用权。由于大家都有自己的电脑,于是 Paul 他们打算开发一个小型系统管理队列。透过这个系统,大家都能看到队列当前的状况。当上一个员工用完烧水器后,系统会通知下一个正在等候的员工。

 

2. 关于 PROTON

Proton 是 Paul 他们四个打算开发的用于管理队列的小型系统的开发代号。Proton 包括以下几个核心类:

  • 1) BOILER:从管理学的角度来看,可供分配和使用的资源永远是稀缺的、不足的,也正因为这种稀缺和不足,人们才需要通过管理务求使得这些资源能够发挥最大的效益。然而,资源使用后所发挥的效益的获益者是有偏向性的。在这起烧水器事件中,烧水器就是这一稀缺的资源,而它的使用效益是应该偏向于集资的“股东”们。Boiler 就代表了这个烧水器。
  • 2) ENROLLEE:Enrollee 代表着与烧水器事件有关的员工,包括“股东”和“非股东”。Proton 的存在意味着资源的收益的分配是不平均的,于是 Enrollee 的设计必须能够体现出“股东”和“非股东”的区别。
  • 3) ENROLLEEQUEUE:为了维护“股东”们的权益,Paul 他们订立了一系列的排队规则。EnrolleeQueue 是一个集合类,提供了必要的接口用于队列操作,它的内部逻辑必须体现出 Paul 他们订立的排队规则。
  • 4) ENROLLEEMANAGER:EnrolleeManager 是 Proton 的后方逻辑负责人,它负责要使用烧水器(Boiler)的员工(Enrollee)的注册和注销、使用排队规则(EnrolleeQueue)来管理等候队列、处理烧水器(Boiler)的分配等。

本文将只讨论 Proton 的后方逻辑的设计与实现,并且重点放在上面所提到的4个核心类中。

 

3. BOILER

3.1 开始烧水...

一个普通的烧水器,无论是用煤气还是用电的,都必定具备烧水的功能,否则就只能当作装饰品了。当你打开煤气炉或者通电后,烧水器就会正式开始烧水了。这里,Enrollee 是通过 Boiler 的 Boil 方法让烧水器开始工作。

现实中的烧水器不会知道更不会记录自己所在的位置,但因为 Proton 在通知下一个使用者的时候必须告诉他到什么地方拿烧水器,于是我为烧水器加入一个 Location 属性指示其当前所在之处。

于是,Boiler.Boil 方法和 Boiler.Location 属性的代码可以这样写:

// Code #01

private string m_Location;
public string Location
{
    
get return m_Location; }
    
internal set { m_Location = value; }
}


public void Boil()
{
    Console.WriteLine(
"Boiling at Room {0}...", m_Location);
}

it知识库烧水器事件簿 [Design, C#],转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。