Как можно контролировать/координировать алгоритм

На рисунке ниже показана простая часть сложного алгоритма.введите здесь описание изображения Я пытаюсь подготовить некоторые классы в соответствии с алгоритмом.

abstract class Person
{
    public string HasXRecords { get; set; }
    public int PersonAnotherFeature { get; set; }
    public List<X> Xs { get; set; } = new List<X>();
}
abstract class X
{
    //There will more than 1000 type subX classes
}

interface IAdder
{
    void AddXToList();
}

interface IRemover
{
    void RemoveXFromList();
}

class XAdderFactory
{
    private Person _person;
    public bool PersonHasNoRecords
    {
        get
        {
            return string.IsNullOrEmpty(_person.HasXRecords);
        }
    }
    public XAdderFactory(Person person)
    {
        this._person = person;
        if (PersonHasNoRecords)
        {
            new XListMakerAFactory(person);
        }
        else
        {
            new XListMakerB(person);
        }
    }
}

class XListMakerB: IAdder
{
    private Person _person;
    public XListMakerB(Person person)
    {
        this._person = person;
        AddXToList();
        new PersonXListEvaluator(person);
    }
    public void AddXToList()
    {
        //Dynamic instance of X will be added in to person Xlist.
    }
}

class XListMakerAFactory
{
    public XListMakerAFactory(Person person)
    {
        switch (person.PersonAnotherFeature)
        {
            case 1:new XListMakerA1(person);
                break;
                //there will be XListMakerA2,XListMakerA3 etc.
        }
        new XRemoverFactory(person);
    }
}
class XListMakerA1: IAdder
{
    private Person _person;
    public XListMakerA1(Person person)
    {
        this._person = person;
        AddXToList();
        new PersonXListEvaluator(person);
    }
    public void AddXToList()
    {
        //_person.Xs.Add(new X1());
        // According to business logic,X2,X3 etc. will be added manually.
    }
}

class XRemoverFactory
{
    public XRemoverFactory(Person person)
    {
        new XRemoverFromList1(person);
        new XRemoverFromList2(person);
    }
}

class XRemoverFromList1 : IRemover
{
    private Person _person;
    public XRemoverFromList1(Person person)
    {
        this._person = person;
        RemoveXFromList();
    }
    public void RemoveXFromList()
    {
        //According some business logic some Xs will be removed.
    }
}

class XRemoverFromList2 : IRemover
{
    private Person _person;
    public XRemoverFromList2(Person person)
    {
        this._person = person;
        RemoveXFromList();
    }
    public void RemoveXFromList()
    {
        //According some business logic some Xs will be removed.
    }
}
 class PersonXListEvaluator
{
    public PersonXListEvaluator(Person person)
    {
        //According to business rules evaluation will be cordinated.
    }
}

Моей главной задачей является управление множеством классов для успешного алгоритма. Я пытаюсь спроектировать, что фабричные методы уровня будут решать, какой класс (на том же уровне) должен быть создан на этом уровне. После создания экземпляра фабричного метода следующего уровня. Поток управляется в конструктор методов фабрики уровня. Считаете ли вы, что это управляемо, обслуживаемо? Вы предлагаете лучшее решение?


person Mehmet    schedule 26.08.2016    source источник
comment
Это похоже на вопрос codereview.stackexchange.com.   -  person jaco0646    schedule 26.08.2016
comment
Я нашел эту ссылку msdn.microsoft.com/en-us/library/ff650706. aspx   -  person Mehmet    schedule 30.08.2016


Ответы (1)


Шаблоны создания:

Вам нужен Abstract_factory, который возвращает два типа фабрик в соответствии с вашими требованиями - type_list_a и type_list_b.

Модели поведения:

Если вы ищете динамический обмен алгоритмом во время выполнения, вам следует использовать Strategy_pattern с Контекст.

Context знает и возвращает конкретный алгоритм, так что клиент не знает все 100 или 1000 классов, реализующих алгоритм.

Пример шаблона стратегии в реальном мире является хорошим примером .

Структурные шаблоны:

Если вы хотите скрыть сложность от клиента, не раскрывая все подсистемы, используйте шаблон Facade. .

Ознакомьтесь с руководствами по созданию исходников, чтобы подробнее узнать о примерах использования каждого шаблона.

person Ravindra babu    schedule 28.08.2016
comment
Спасибо за Ваш ответ. - person Mehmet; 28.08.2016
comment
Еще раз спасибо. Я посмотрел Facade и думаю, что Facade - это то, что я ищу. - person Mehmet; 28.08.2016
comment
Будьте осторожны со статьей в Википедии об абстрактной фабрике. Он содержит смесь правильной и неправильной информации. В частности, первая диаграмма классов, а также примеры C# и Java неверны. Лучшие ресурсы: создание исходников, oodesign и гуру весны. Википедия не лучший ресурс для изучения шаблонов проектирования, потому что ее редактируют не технические писатели. - person jaco0646; 30.08.2016