可以是多种类型的人/工人的对象模型(“工作”)

时间:2010-01-20 21:33:47

标签: php data-modeling

假设我正在塑造一群工作狂。我们有鲍勃,他既是水管工也是木匠。简,是老师。最后,杰克,侦探,保龄球馆的企业家和疯狂的科学家。

每个职位或职位类型都可以具有仅针对该职位的属性或方法。例如,管道工将拥有类似fixLeakingSink()的方法以及教师不会拥有的exposedButtCrack等属性。但是,会有一些共享的属性和方法。

如果我的超类是一个Worker,并且我避免了多重继承,那么为这样的场景建模的最佳实践方法是什么?我最初考虑使用Decorator设计模式,但我不确定这是否是正确的应用程序。 (如果知道这将实现什么语言是有帮助的,或者你想在你的解释中包含代码片段,那就是PHP5。)

3 个答案:

答案 0 :(得分:1)

我可能会使用合成并拥有一个拥有一组作业的工人。每个作业可能都有一个通用接口,但也可以包含它自己的方法。 Decorator并不真正适用于此,因为它假设一个通用接口,您可以在其中构建该单一接口的实现。使用组合将允许您可以灵活地拥有各种类型的任意数量的工作。

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() { ... }
}

答案 1 :(得分:0)

看起来非常简单。

每种工作类型都扩展了工人

Worker包含(引用)作业实例的集合。

Job与任何事物都没有继承关系(除非您想为问题添加更多信息)。

答案 2 :(得分:0)

我会阅读Martin Fowler撰写的一些文章:Dealing with RolesAccountability,然后再决定。