1

Ниже приведена простая часть сложного алгоритма. enter image description here Я пытаюсь подготовить несколько классов в соответствии с алгоритмом.Как можно управлять/скоординированный алгоритм

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. 
    } 
} 

Моя главная задача заключается в управлении много classess к SucceS algorithm.I попытаться разработать, что уровень фабричные методы будут решать, какой класс (на том же уровне), должны быть созданы на этом уровне После этого следующий уровень завода метод instantiated.Flow управляется в конструкторе фабричных методов уровня. Как вы думаете, это управляемо, maintable? Предлагаете ли вы лучшее решение?

+0

Это похоже на вопрос http://codereview.stackexchange.com/. – jaco0646

+0

Я нашел эту ссылку https://msdn.microsoft.com/en-us/library/ff650706.aspx – Mehmet

ответ

1

Порождающие модели:

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

Поведенческие модели:

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

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

Real World Example of the Strategy Pattern обеспечивает хороший пример.

Структурные модели:

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

Посмотрите на sourcemaking учебники для получения более подробной информации о вариантах использования каждого шаблона.

+0

Спасибо за ваш ответ. – Mehmet

+0

Еще раз спасибо.Я посмотрел на Facade, и я думаю, что Facade - тот, который я ищу. – Mehmet

+0

Будьте осторожны с этой статьей в Википедии для абстрактной фабрики. Он содержит комбинацию правильной и неправильной информации. В частности, неправильная диаграмма первого класса, а также примеры C# и Java. Лучшие ресурсы: [sourcemaking] (https://sourcemaking.com/design_patterns/abstract_factory), [oodesign] (http://www.oodesign.com/abstract-factory-pattern.html) и [весенний гуру] (https://springframework.guru/gang-of-four-design-patterns/abstract-factory-design-pattern/). Википедия не является отличным ресурсом для обучения шаблонам дизайна, потому что редактируется нетехническими писателями. – jaco0646

Смежные вопросы