Найдено результатов: 2

Каковы некоторые примеры реализации шаблонов проектирования с использованием JavaScript?

Я умеренно квалифицированный программист, использующий JavaScript, но я не гуру. Я знаю, что вы можете делать с ним довольно мощные вещи, просто я не видел ничего, кроме довольно простых манипуляций DOM. Мне интересно, могут ли люди привести некоторые примеры традиционных концепций дизайна, таких как фабричный метод, Singleton и т. д. с использованием JavaScript. В каких случаях эти шаблоны будут использоваться в интернете?

javascript   design-patterns   singleton   strategy-pattern   factory-method    

441   10   01:27, 25th August, 2020


Абстрактный Шаблон Дизайна Фабрики

Я работаю над внутренним проектом для своей компании, и часть проекта заключается в том, чтобы иметь возможность анализировать различные "Tasks" из файла XML в коллекцию задач, которые будут выполняться позже.

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

Для этого я построил абстрактный базовый класс:

public abstract class Task
{
    public enum TaskType
    {
        // Types of Tasks
    }   

    public abstract TaskType Type
    {
        get;
    }   

    public abstract LoadFromXml(XmlElement task);
    public abstract XmlElement CreateXml(XmlDocument currentDoc);
}

Каждая задача наследуется от этого базового класса и включает в себя код, необходимый для создания себя из переданного в XmlElement, а также сериализации себя обратно в XmlElement.

Основные примеры:

public class MergeTask : Task
{

    public override TaskType Type
    {
        get { return TaskType.Merge; }
    }   

    // Lots of Properties / Methods for this Task

    public MergeTask (XmlElement elem)
    {
        this.LoadFromXml(elem);
    }

    public override LoadFromXml(XmlElement task)
    {
        // Populates this Task from the Xml.
    }

    public override XmlElement CreateXml(XmlDocument currentDoc)
    {
        // Serializes this class back to xml.
    }
}

Затем синтаксический анализатор будет использовать код, подобный этому, чтобы создать коллекцию задач:

XmlNode taskNode = parent.SelectNode("tasks");

TaskFactory tf = new TaskFactory();

foreach (XmlNode task in taskNode.ChildNodes)
{
    // Since XmlComments etc will show up
    if (task is XmlElement)
    {
        tasks.Add(tf.CreateTask(task as XmlElement));
    }
}

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

Однако я не доволен своим кодом для TaskFactory.CreateTask. Этот метод принимает значение XmlElement, а затем возвращает экземпляр соответствующего класса задач:

public Task CreateTask(XmlElement elem)
{
    if (elem != null)
    {
        switch(elem.Name)
        {
            case "merge":
                return new MergeTask(elem);
            default:
                throw new ArgumentException("Invalid Task");
        }
    }
}

Поскольку мне нужно разобрать XMLElement, я использую огромный (10-15 случаев в реальном коде) переключатель, чтобы выбрать, какой дочерний класс создать. Я надеюсь, что есть какой-то полиморфный трюк, который я могу сделать здесь, чтобы очистить этот метод.

Какой-нибудь совет?

c#   design-patterns   factory    

448   10   07:33, 9th August, 2020