представлять
Модель стратегии определяет семейство алгоритмов и инкапсулирует их отдельно, чтобы они могли заменить друг друга. Эта модель позволяет изменения в алгоритме не влиять на клиентов, используя алгоритм.
текст
Прежде чем понять модель политики, давайте сначала приведем пример. Вообще говоря, если мы хотим проверить легитимность данных, мы часто судим в соответствии с заявлением о развертывании, но это приносит несколько проблем. Прежде всего, если мы увеличим спрос, мы должны снова изменить этот код, чтобы увеличить логику, и он станет все более и более сложным при проведении модульных тестов. Код заключается в следующем:
Кода -копия выглядит следующим образом:
varidator = {
проверка: function (значение, тип) {
Switch (type) {
case 'isnonempty':
{
вернуть истину; // результат неэпутной проверки
}
Case 'isnumber':
{
вернуть истину; // результат проверки номеров
перерыв;
}
случай 'isalphanum':
{
вернуть истину; // Результат проверки Alphanum
}
по умолчанию:
{
вернуть истину;
}
}
}
};
// тест
alert (valyator.validate ("123", "isnonempty"));
Так как же избежать проблем в приведенном выше коде? Согласно шаблону политики, мы можем инкапсулировать один и тот же рабочий код в разные классы отдельно, а затем обрабатывать его с помощью унифицированного класса обработки политики. Хорошо, мы сначала определяем класс обработки политики, код выглядит следующим образом:
Кода -копия выглядит следующим образом:
var varidator = {
// все места, где все классы обработки правил проверки могут быть сохранены, будут определены отдельно позже
Типы: {},
// Сообщение об ошибке, соответствующее типу проверки
Сообщения: [],
// Конечно, тип проверки, который необходимо использовать
config: {},
// обнаружил метод публичной проверки
// Перепущенный параметр - пара значений.
проверка: function (data) {
var i, msg, type, checker, result_ok;
// Очистить все сообщения об ошибках
this.messages = [];
для (я в данных) {
if (data.hasownproperty (i)) {
type = this.config [i]; // Проверьте, существует ли правило проверки на основе ключа
Checker = this.Types [type]; // Получить класс проверки для правила проверки
if (! type) {
продолжать; // Если правило проверки не существует, оно не будет обработано
}
if (! Checker) {// Если класс правил проверки не существует, исключение брошено
бросать {
Имя: "ValidationError",
Сообщение: «Нет обработчика для проверки типа» + Тип
};
}
result_ok = cecker.validate (data [i]); // Проверьте использование одного класса проверки
if (! result_ok) {
msg = "неверное значение для *" + i + " *," + cecker.instructions;
this.messages.push (msg);
}
}
}
вернуть это. HasErrors ();
},
// помощник
haserrors: function () {
вернуть это.messages.length! == 0;
}
};
Тогда остальное должно определить различные классы проверки, хранящиеся в типах. Давайте приведем вам несколько примеров здесь:
Кода -копия выглядит следующим образом:
// Убедитесь, что данное значение не пусто
valyator.types.isnonempty = {
проверка: function (value) {
возвращаемое значение! == "";
},
Инструкции: «Прошлое значение не может быть пустым»
};
// Убедитесь, что данное значение - это число
varidator.types.isnumber = {
проверка: function (value) {
return! Isnan (значение);
},
Инструкции: «Продолжаемая стоимость может быть только законным числом, например: 1, 3,14 или 2010»
};
// Убедитесь, что данное значение - это просто буква или число
varidator.types.isalphanum = {
проверка: function (value) {
вернуть!/[^a-z0-9] /i.test (значение);
},
Инструкции: «Переданное значение может защищать только буквы и цифры и не может содержать специальных символов»
};
При его использовании нам сначала необходимо определить набор данных, который необходимо проверить, и затем нам нужно определить тип правила, который необходимо проверить для каждого данного. Код заключается в следующем:
Кода -копия выглядит следующим образом:
var data = {
First_name: "Том",
LAST_NAME: "XU",
Возраст: «неизвестно»,
Имя пользователя: "Tomxu"
};
varidator.config = {
first_name: 'isnonempty',
Возраст: 'isnumber',
Имя пользователя: «Исальфанум»
};
Наконец, код для получения результата проверки прост:
Кода -копия выглядит следующим образом:
valyator.validate (data);
if (valyator.haserrors ()) {
console.log (valyator.messages.join ("/n"));
}
Суммировать
Стратегический шаблон определяет серию алгоритмов. Концептуально, все эти алгоритмы делают одно и то же, но реализация отличается. Они могут вызывать все методы одинаково, уменьшая связь между различными классами алгоритма и используемыми классами алгоритма.
С другого уровня определение класса алгоритма отдельно также облегчает модульные тестирование, поскольку его можно проверить отдельно с помощью вашего собственного алгоритма.
На практике могут быть инкапсулированы не только алгоритмы, но и практически любой тип правил. Необходимо применять различные бизнес -правила в разное время в процессе анализа, поэтому вы можете рассмотреть, что модель политики необходима для обработки различных изменений.