Java 我应该使用哪种设计模式来模拟人员角色关系?
我只是不知道我应该在这里采用哪种设计模式。假设我有这样的课:Java 我应该使用哪种设计模式来模拟人员角色关系?,java,design-patterns,Java,Design Patterns,我只是不知道我应该在这里采用哪种设计模式。假设我有这样的课: class Person String role; public void takeRole(String role) { this.role = role; } public void do() { switch(role) case a: do this and that; this.role = b; case b: do this and that;
class Person
String role;
public void takeRole(String role) {
this.role = role;
}
public void do() {
switch(role)
case a:
do this and that;
this.role = b;
case b:
do this and that;
case c:
do this and that;
this.role=a;
....
简而言之,一个人有角色,do()方法取决于他的角色是什么。在某些情况下,他可能不得不转换角色。我认为应该抽象这个do()(因为将来可能会定义其他角色,所以更应该抽象)——但是如何抽象呢?应该有一个角色类吗
任何帮助都将不胜感激
编辑:
谢谢大家抽出时间。我想补充一点。我确实考虑过(至少作为一个想法)许多建议的解决方案。以下是我的困难:如果我将Person类(如PersonTypeA、personTypeB等)划分为子类,并将每个特定角色分配给适当的Person类型,那么我在转换角色时就会遇到困难(例如,工程师变成了会计师!——至少可以说很奇怪
另一方面,如果我为每个角色创建类,那么(1)角色感觉不像对象,因为(至少在我的例子中)角色没有属性,只有方法。因此,角色1和角色2没有区别。但是对于每个人,我必须创建一个新的角色对象——即使他们都共享同一个角色
我不确定我是否说得很清楚,我也不确定我的观点是否有意义。不是从设计模式的角度,而是从逻辑的角度来看: 与使用一个巨大的“if role is this,do that,else if is this”语句不同,使用DoThis()方法的某种role类会更容易 一个人有一个角色。一个人可以做this(),然后这个角色也可以做this()
而不是一个人根据角色说他们做什么,角色说他们能做什么。我会用do方法制作一个界面,比如
interface Action {
void do()
}
然后定义一个Map
,这样给定一个角色,相关的动作可以通过actionMap.get(role)
检索。然后只需通过actionMap.get(role.do()
对动作调用do()
,我看到这里也出现了一个新的动作。例如,您可以按照以下思路设计一些东西:
interface Role {
public void doRole(Context context);
}
class RoleA implements Role {
public void doRole(Context context) {
// do this and that
context.setRole(new RoleB());
}
}
class RoleB implements Role {
public void doRole(Context context) {
// do that and this
context.setRole(new RoleA());
}
}
class Context {
private Role _role;
public Context() {
// set initial role
setRole(new RoleA());
}
public void setRole(Role newRole) { _role = newRole; }
public doSomething() {
_role.doRole(this);
}
}
在本例中,通过请求当前分配的
角色
对象来委托上下文
对象的行为。具体角色本身具有定义角色之间转换的方法。实际上,这里出现的是一个简单的状态机,其中具体的角色
是节点和调用我想说的是,一个角色有一个人。我会有一个角色接口,它的具体实现将包装一个人,并用我需要的任何新功能装饰它
public interface Role
{
Person getPerson();
void action(); // might need more here
};
public class Person
{
// whatever fields you need
}
public class Admin
{
private Person person;
public Admin(Person p) { this.person = person; }
public void action() { } // some some admin stuff.
}
您可能想看看Coad的领域中立组件: 这有多个角色的人,但通过包括事件(瞬间间隔)使事情变得更进一步。他还谈到了很多关于彩色模特的话题,这很有趣,但不要让它让你感到不快——我认为这些想法很好
伊恩。我发现,与人、公司和角色打交道是一件反复重复的事情。马丁·福勒(Martin Fowler)的《分析模式》一书(与沃德·坎宁安和拉尔夫·杰克逊合著)进行了广泛的讨论,值得深入阅读 “处理角色”一章的在线版本(或其摘要,我手头没有这本书)可以在以下位置找到:
Martin Fowler的网站也有一个完整的部分处理分析模式:因此用户永远不能同时拥有2个以上的角色。例如:Lead,Developer?感谢您的回复。我会再考虑一下,然后回复您。如果您想提供更多信息,请更新您的问题或留下评论。我已将您的答案转换为l参考注释。吹毛求疵:
do
是一个关键字,像do()
这样的方法不会编译;)我将编辑我的答案。我只是离开了OP发布的代码。;-)