2010-01-20 37 views
0

假設我正在模擬一羣工作狂。我們有鮑勃,他既是水管工又是木匠。 Jane有一位老師。最後,傑克,偵探,保齡球館的企業家和瘋狂的科學家。可以是多種類型(「工作」)的人員/工作者的對象模型

每個職位或工作類型都可以具有專屬於該職位的屬性或方法。例如,水管工將擁有像fixLeakingSink()這樣的方法和像老師不會擁有的exposedButtCrack等屬性。但是,會有一些共享的屬性和方法。

如果我的父類是一個Worker,並且我正在避免多重繼承,那麼建立這樣一個場景的最佳實踐方式是什麼?我最初考慮使用裝飾設計模式,但我不確定這是否是正確的應用程序。 (如果知道這將實施哪種語言是有幫助的,或者您希望在您的解釋中包含代碼片段,則它是PHP5。)

回答

1

我可能會使用組合,並有一個工作人員有一個工作集合。每個作業可能有一個通用的界面,但也可以包含它自己的方法。裝飾器在這裏並不適用,因爲它假設了一個通用接口,在該接口中構建了單一接口的實現。使用組合可以讓你有一個共同的工作人員,可以靈活地擁有各種類型的任何數量的可能工作。

C#實現:

public interface IWorker 
{ 
    void AddJob(Job job); 
    void RemoveJob(Job job); 
    void SetCurrentJob(Job job); 
    Job GetCurrentJob(); 
} 

public interface IJob 
{ 
    void Work(); 
} 

public class Worker : IWorker 
{ 
    private List<Job> Jobs { get; set; } 

    private int CurrentJob { get; set; } 

    public Worker() 
    { 
     this.Jobs = new List<Job>(); 
     this.CurrentJob = -1; 
    } 

    public void AddJob(Job job) 
    { 
     this.Jobs.Add(job); 
    } 
    public void RemoveJob(Job job) { ... } 
    public void SetCurrentJob(Job job) { ... } 
    public Job GetCurrentJob() 
    { 
     return this.CurrentJob > 0 ? this.Jobs[this.CurrentJob] : null; 
    } 
} 

public class Bartender : IJob 
{ 
    public Work() 
    { 
     this.OpenBar(); 
     this.TendBar(); 
     this.Close(); 
     this.CleanUp(); 
    } 

    public void OpenBar() { ... } 
    public void TendBar() { ... } 
    public void Close() { ... } 
    public void CleanUp() { ... } 
} 
0

似乎很直接。

每個作業類型擴展工人

工人包含(引用)的工作實例的集合。

作業與任何東西都沒有繼承關係(除非您想向問題添加更多信息)。

相關問題