2011-02-03 149 views
3

我只是無法弄清楚我應該採用哪種設計模式。說我有這樣的課程:我應該使用哪種設計模式來建模人與角色關係?

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()應該被抽象(更多的是因爲將來可能會定義其他角色)---但是怎麼做呢?是否應該有一個角色類?

任何幫助將不勝感激。

編輯:

感謝您的保時,人。我想補充一點。我確實認爲(至少作爲一個想法)許多建議的解決方案。以下是我的困難:如果我將人員類(如PersonTypeA,personTypeB等)分類並將每個特定角色分配給相應的人員類型,那麼在切換角色時會遇到困難(例如,工程師成爲會計師! ---很奇怪,至少可以說

另一方面,如果我爲每個角色創建類,那麼(1)角色感覺不像一個對象,因爲(至少在我的情況下)是一個角色沒有屬性,只有方法,因此,role_A_1與role_A_2沒有什麼不同,但是對於每個人我都必須創建一個新的角色對象 - 即使它們共享相同的角色。我不確定自己是否清楚,我不確定我的觀點是否合理。

+0

所以用戶永遠不會有2+的角色,在同一時間。 IE:領導,開發人員? – 2011-02-03 18:48:06

+0

感謝您的回覆。我會再想一想,回到你身邊。 – blackened 2011-02-04 10:43:01

+0

如果您想提供更多信息,請更新您的問題或留下意見。我已將您留下的答案轉換爲評論。 – 2011-02-04 10:44:19

回答

7

不在設計模式的方式,但更以邏輯方式:

而是有一個巨大的「如果角色是這樣的,這樣做,否則,如果是這種」聲明,使用DoThis()方法的某種Role類會更容易。

一個人有一個角色。一個人可以DoThis(),那個角色也可以DoThis()。

而不是一個人說他們根據角色所做的事情,角色說他們可以做什麼。

0

我會做一個接口與做法,像

interface Action { 
    void do() 
} 

,然後定義Map<String, Action>,使之發出一定的作用,相關的行動可以通過actionMap.get(role)檢索。然後只需撥打do()就行動了actionMap.get(role).do()

5

我看到State Pattern這裏也出現了。通過詢問其當前分配Role對象做

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); 
    } 
} 

在這個例子中,你委派Context對象所做的行爲:例如,你可以沿着線設計的東西。具體角色本身具有定義角色之間轉換的方法。實際上,這裏出現的是一個簡單的狀態機,其中具體的Roles是節點並且調用setRole()邊緣。

0

我會說一個角色是一個人。我有一個Role接口,它的具體實現會包裝一個Person並用我需要的任何新功能來裝飾它。

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. 
} 
1

你可能想看看COAD的域名中性組分:

http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf

這與多重角色的人,而是由包括事件(時刻間隔)還需要的東西一點。他還談論了很多關於顏色建模的內容,這很有趣,但不要讓它讓你失望 - 我認爲這些想法非常合理。

伊恩。

1

我發現處理人員,公司和角色是一再重複的事情。馬丁福勒的分析模式書(與沃德坎寧安和拉爾夫傑克遜)有一個廣泛的討論,值得深入閱讀。

在線版本的「處理角色」一章(或其摘要,我沒有這本書方便)可以找到:http://martinfowler.com/apsupp/roles.pdf

Martin Fowler的網站也有一整節處理分析模式:http://martinfowler.com/apsupp/roles.pdf

相關問題