假设我正在塑造一群工作狂。我们有鲍勃,他既是水管工也是木匠。简,是老师。最后,杰克,侦探,保龄球馆的企业家和疯狂的科学家。
每个职位或职位类型都可以具有仅针对该职位的属性或方法。例如,管道工将拥有类似fixLeakingSink()的方法以及教师不会拥有的exposedButtCrack等属性。但是,会有一些共享的属性和方法。
如果我的超类是一个Worker,并且我避免了多重继承,那么为这样的场景建模的最佳实践方法是什么?我最初考虑使用Decorator设计模式,但我不确定这是否是正确的应用程序。 (如果知道这将实现什么语言是有帮助的,或者你想在你的解释中包含代码片段,那就是PHP5。)
答案 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 Roles和Accountability,然后再决定。