2008-10-14 19 views
3

我需要建立一个系统的模型,在这个系统中将有一个团队,他将由在团队中执行角色并具有分配给他们的技能的用户组成。建模包含团队,角色和技能的结构是否有设计模式?

即A队5名成员,一个执行组组长的角色,所有进行回复 电子邮件的作用,但一些有额外的技能接听电话

我试图确定如何我可以最好地模拟这一点。

这个问题一定是在之前解决的,有没有什么好的资源如何建模?

编辑:我需要确定哪些用户被允许做什么,这可能是因为他们在某支球队,进行了一定的作用或者被分配一定的技巧

回答

1

算不上什么我已经听到了,但它很简单,可以用各种方式解决。

所以有团队,成员,角色和技能。团队只是成员容器,成员具有角色和技能。

这里的又一个小假,给你的整体思路:

class Team 
    container[Member] members 

class Member 
    container[Role] roles 
    container[Skill] skills 

然后你实例或子类角色和技能,这取决于什么的事情,他们是善良,你的编程语言的能力。

..另一方面,在实践中,制作一个类似于角色和技能类的团队类是成员类的一个属性。如果您需要找出某个成员可以访问的内容。

+0

问题就变得更复杂一点的时候可以分配角色和技能,团队,角色和技能的个人,然后考虑从球队帐户继承。 你也需要考虑让一个拥有特权的用户控制一个你不想从那里继承的团队 – 2008-10-14 10:43:12

+0

是的,但是我仍然要从这个方向来解决问题。嗯。那么..如果它会被修改为你所说的,它会更有用,改变它有点... – Cheery 2008-10-14 14:03:31

2

我用谷歌搜索这个,所以把它与一粒盐。我在角色建模和对象上找到了这个paper。在页30上有一个角色模式。希望这不是一个疯狂的追逐你。下面是总结

的作用模式可以让你设计出可扩展的新 上下文对象,叫角色运行时组件。根据上下文 对象模式使用角色扩展组件。组件对应于一个装饰器的组件,并且角色对应于上下文对象 。角色扮演组件的国家整合通过应用 财产和策略来实现。属性用于定义组件的状态空间,并且使用策略来提供属性依赖的行为。

2

听起来好像你可以在这里使用复合模式的变体,至少是部分问题。您可以从作为超类的单元开始,然后您可以将团队作为单元的子类。团队是一个可能包含其他单位的容器。另外你可以有User子类Unit。因此,您可以编写简单定位单元的代码,并以相同的方式对待所有团队和用户。然后,您可以创建一些由其他团队组成的复杂团队。

因此,您可以为每种类型的用户或您需要的团队类型提供一个类。

如果角色数量急剧增长,并且结束了太多的类(类爆炸),则可以应用装饰器模式。因此,用另一个具有相似接口但具有不同(或附加)功能的对象来包装(装饰)对象。

所以你可以有一个BasicUser和AnswerPhoneDecorator。将任何BasicUser对象包装在AnswerPhoneDecorator中,并且您有一个可以接听电话的用户。

+0

我认为使用装饰模式应该能够解决这个问题。我需要添加另一个班级,员工,装饰,技能,角色,团队和团队的复合模式。大多数情况下,“目前为止我的头脑设计”,但我会在下周考虑设计,如果更新,然后 – 2008-10-17 21:25:01

0

在你的例子中,我至少会有TeamMember BaseClass和2个接口(iEmail和iPhone)。任何新的角色都将从TeamMember类继承,并且取决于它可以做什么,实现适当的接口......简而言之,角色将作为继承自TeamMember的类实现,并且技能将作为接口实现。

例如,组长可以打电话。然后我会在TeamLeader类从TeamMember继承和虽然我相信设计模式是一个很好的工具实现iPhone界面

RWendi

0

,我不认为我会使用任何特定的模式对于这个问题。相反,我会尝试从另一个角度来看待它。我建议使用一个数据库来存储关于你的团队,团队成员和他们角色的数据。现在,数据库并不完全是我更强大的一面,但我会给它一个镜头:
创建一个表来容纳来自所有团队的所有团队成员。该表应具有属性:名称,角色,团队,技能,分别代表成员的姓名和角色,他/她所属的团队以及他/她的技能。
现在,假设您的应用中有以下角色:RoleA(适用于可以接听电话和发送电子邮件的人),roleB(只能发送电子邮件)和RoleLeader角色(可以接听电话,发送电子邮件例如 角色表将包含应用程序中的所有角色,属性将是(在这种情况下):name(角色的名称),canAnswerPhone(布尔值,表示具有此功能的用户角色可以接听电话),可以发送电子邮件(布尔表示他/她是否可以发送电子邮件)等等......
例如,第三张表可以容纳您应用中的所有团队,并且关于他们的各种数据(比如团队正在从事的项目等......)
现在,您可以轻松获得团队中的所有成员,他们可以做什么,改变他们的角色,查看领导者是谁,改变某个角色的作用等等...

我希望这对你有意义。祝你好运,设计你的应用程序!

0

这取决于你正在建模的东西。鉴于上面的例子,你是否希望能够找到最适合给定问题的团队成员?

如果是这样的话,我会推荐这样的: 想象角色和技能作为无向图中的顶点。一个给定的角色被链接(通过边缘)到其能力的每个技能上(假定技能是由角色给予的,而不仅仅是基于个人)。现在将所有团队成员连接到他们在团队中的角色以及团队成员到适当的团队。

此图现在模拟您的团队,团队成员,他们的角色以及他们应该赋予其角色的技能之间的关联。

现在,将给定的问题映射到团队成员(甚至团队),并将其连接到您认为需要的每种不同技能(即电子邮件,数据库,Web UI,Web服务,等等。)。现在您可以将问题与这些实体联系起来。

我不会仔细检查您可以运行的所有类型的报告,但这里有一个简单的报告。如果你想找到一个人(如果有的话),可以解决这个问题,我会建议一个图的遍历是这样的:

class Problem 
{ 
    find_problem_solvers() 
    { 
    var problem_solvers = null 
    for each (skill in skills_required) 
    { 
     var possible_problem_solvers = skill.find_problem_solvers() 
     if(problem_solvers == null) 
     { 
     problem_solvers = new list().add_range(possible_problem_solvers) 
     } 
     else 
     { 
     for each problem_solver in problem_solvers: 
     { 
      if(problem_solver not in possible_problem_solvers) 
      problem_solvers.remove(problem_solver) 
     } 
     } 
     //No point continuing if we eliminated everyone! 
     if(problem_solvers is empty) break; 
    } 
    return problem_solvers 
    } 
} 

正如你可以在这方面看,我没有太大的利用为其他海报的模式。如果你想模拟域安全或某种不同的业务逻辑。他们的技术很可能是正确的。

顺便说一下,应该指出,上述算法并不是最优的。