Результаты поиска
Каковы некоторые примеры реализации шаблонов проектирования с использованием JavaScript?
Я умеренно квалифицированный программист, использующий JavaScript, но я не гуру. Я знаю, что вы можете делать с ним довольно мощные вещи, просто я не видел ничего, кроме довольно простых манипуляций DOM. Мне интересно, могут ли люди привести некоторые примеры традиционных концепций дизайна, таких как фабричный метод, Singleton и т. д. с использованием JavaScript. В каких случаях эти шаблоны будут использоваться в интернете?
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 случаев в реальном коде) переключатель, чтобы выбрать, какой дочерний класс создать. Я надеюсь, что есть какой-то полиморфный трюк, который я могу сделать здесь, чтобы очистить этот метод.
Какой-нибудь совет?