Объектная модель для людей / работников, которые могут быть нескольких типов («рабочие места») - PullRequest
0 голосов
/ 21 января 2010

Допустим, я моделирую рабочую силу трудоголиков. У нас есть Боб, который по профессии является водопроводчиком и плотником. Там Джейн, которая является учителем. И, наконец, Джек, детектив, предприниматель в кегельбане и безумный ученый.

Каждая позиция или тип работы может иметь свойства или методы, специфичные только для этой работы. Например, у сантехника будут методы, такие как fixLeakingSink (), и свойства, такие какctedButtCrack, которых у учителя не будет. Но будут некоторые общие свойства и методы.

Если мой суперкласс - работник, а я избегаю множественного наследования, каков наилучший способ моделирования такого сценария? Первоначально я рассмотрел использование шаблона проектирования Decorator, но я не уверен, что это правильное применение для него. (Если полезно знать, на каком языке это будет реализовано, или вы хотите включить фрагменты кода в свое объяснение, это PHP5.)

Ответы [ 3 ]

1 голос
/ 21 января 2010

Я бы, вероятно, использовал композицию и имел бы Работника, у которого есть коллекция Джобсов. Каждое задание может иметь общий интерфейс, но также может включать свои собственные методы. Декоратор на самом деле не применяется, так как он предполагает общий интерфейс, в котором вы создаете реализацию этого единственного интерфейса. Использование композиции позволит вам обычному работнику с гибкостью иметь любое количество возможных заданий различных типов.

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 голосов
/ 21 января 2010

Я бы прочитал несколько статей Мартина Фаулера: Работа с ролями и Подотчетность , а затем решил бы.

0 голосов
/ 21 января 2010

Кажется довольно простым.

Каждый тип задания расширяет рабочий

Работник содержит (ссылки) коллекцию экземпляров задания.

Задание не имеет отношения наследования ни к чему (если вы не хотите добавить больше информации к проблеме).

...