我需要建立一个系统模型,在这个系统中,将有一个团队,该团队将由在团队中执行角色并分配技能的用户组成。
即。一个团队一个5个成员,一个执行团队领导角色,所有人都执行回复 电子邮件角色,但有些人有额外的技能来接听电话
我正在试图确定如何最好地模拟这个。
此问题必须先解决,有没有关于如何建模的好资源?
编辑:我需要确定允许用户做什么,这可能是因为他们在某个团队中,执行某个角色或被分配了某种技能
答案 0 :(得分:2)
Role模式允许您设计一个可以在运行时使用new扩展的Component 上下文对象,称为角色。根据上下文,使用角色扩展组件 对象模式。 Component对应于Decorator的Component,而Role对应 到一个Context对象。通过应用实现角色扮演组件的状态集成 财产和战略。属性用于定义Component的状态空间,和 策略用于提供依赖于属性的行为。
答案 1 :(得分:2)
听起来你可以在这里使用复合图案的变体,至少部分问题。您可以从作为超类的单元开始,然后您可以将Team作为Unit的子类。团队是一个可能包含其他单位的容器。此外,您可以拥有User子类Unit。因此,您可以编写仅针对该单元的代码,并以相同的方式处理所有团队和用户。然后,您可以创建一些由其他团队组成的复杂团队。
因此,您可以为每种类型的用户或您需要的团队类型提供课程。
如果角色数量急剧增加并且您最终导致类太多(类爆炸),则可以应用Decorator模式。因此,您使用具有类似接口但具有不同(或其他)功能的另一个对象来包装(装饰)对象。
所以你可以拥有一个BasicUser和AnswerPhoneDecorator。将任何BasicUser对象包装在AnswerPhoneDecorator中,你就有一个可以接听电话的用户。
答案 2 :(得分:1)
不是我听过的任何东西,但它很简单,可以通过各种方式解决。
所以有团队,成员,角色和技能。团队只是会员容器,会员有角色和技能。
这是一个很小的假,给你全部的想法:
class Team
container[Member] members
class Member
container[Role] roles
container[Skill] skills
然后根据它们是什么类型以及编程语言的功能来实例化或子类化角色和技能。
..另一方面,在实践中,使一个Team -class类似于Role-Skill -class - Member -class的一个属性可能是有意义的。如果您需要找出一个成员可以访问的内容。
答案 3 :(得分:0)
在你的例子中,我至少会有TeamMember BaseClass和2个接口(iEmail和iPhone)。任何新角色都将从TeamMember类继承,并根据它可以做什么,实现适当的接口......简而言之,角色将实现为继承自TeamMember的类,并且技能将作为接口实现。 / p>
例如,团队负责人可以拨打电话。然后我会让TeamLeader类继承自TeamMember并实现iPhone界面
答案 4 :(得分:0)
虽然我认为设计模式是一个很好的工具,但我认为我不会使用任何特定模式来解决这个问题。相反,我试图从不同的角度来看待它。我建议使用一个数据库,它将存储有关您的团队,团队成员及其角色的数据。现在,数据库并不是我更强大的一面,但我会试一试:
创建一个表格,以容纳所有团队中的所有团队成员。该表应具有以下属性:名称,角色,团队,技能,分别代表成员的名称和角色,他/她所属的团队以及他/她的技能。
现在,假设您在应用中拥有以下角色:RoleA(可以接听电话和发送电子邮件的人),roleB(只能发送电子邮件)和角色TeamLeader(可以接听电话,发送电子邮件)例如,去参加会议。
角色表将包含您应用中的所有角色,属性将是(在这种情况下):名称(角色的名称),canAnswerPhone(布尔说明具有此角色的用户是否可以接听电话),可以发送电子邮件邮件(布尔说他/她是否可以发送电子邮件)等等......
例如,第三个表可以包含应用程序中的所有团队,以及有关它们的各种数据(例如,团队正在处理的项目等等)。
现在,您可以轻松获得团队中的所有成员,他们可以做什么,更改他们的角色,查看领导者是谁,更改某个角色的作用等等......
我希望这对你有意义。祝您好运,设计您的应用程序!
答案 5 :(得分: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
}
}
正如你在这方面所看到的,我对其他海报的模式没有多大用处。如果您正在尝试建模域安全性或某种不同的业务逻辑。他们的技术很可能是正确的。
顺便说一句,应该注意上述算法不是最佳的。
答案 6 :(得分:0)
我发现Enterprise Patterns and MDA: Building Better Software with Archetype Patterns and UML中的第5章讨论了如何很好地建立关系模型