Модуль

Паттерн Модуль относится к группе порождающих паттернов. Данный паттерн создает подпрограмму, которая:

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

Можно заметить, что паттерн Модуль очень похоже на класс в ООП. Он позволяет скрывать свои данные и не засоряет ими внешнюю область программы, инкапсулируя всю логику внутри себя. Кроме того, модуль может быть универсальным и многократно используемым. Все эти преимущества наряду с простой реализацией сделали данный паттерн очень распространенным.

Структура паттерна Модуль:

// приватная логика модуля, скрытая для модификации извне..
const Module = ((params) => {
return {
// функции, которые может использовать клиентский код:
publicProp: () => {}
};
})(params); //аргументы модуля

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

const colorize = (function(color){
const _defaultCallback = (text) => text;
const _log = (text, callback) => console.log('%c ' + callback(text), 'color: ' + color);
return {
log: (text) => _log(text, _defaultCallback),
getLog : _log
};
})("green");

const loudize = (function(colorize) {
let _repeatCount = 1;
const _callback = (text) => text.toUpperCase() + "!".repeat(_repeatCount);
return {
log: (text) => colorize.getLog(text, _callback),
setRepeat: (n) => _repeatCount = n
};
})(colorize);


colorize.log('this is normal');
// вывод зеленой надписи "this is normal"

loudize.log('this is loud');
// вывод зеленой надписи "THIS IS LOUD!"

loudize.setRepeat(12);
loudize.log('this is 12 times louder');
// вывод зеленой надписи "THIS IS 12 TIMES LOUDER!!!!!!!!!!!!"

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

Редактировать на GitHub