Паттерны проектирования - основа любого хорошего программного обеспечения. Программы на JavaScript не исключение.

В этой статье мы рассмотрим цепочку ответственности, шаблоны синглтон и наилегчайший вес.

Схема цепочки ответственности

Цепочка ответственности аналогична шаблону наблюдателя, за исключением того, что он отправляет уведомление одному объекту, а затем этот объект отправляет уведомление другому объекту и так далее.

В шаблоне наблюдателя уведомление отправляется всем наблюдателям одновременно.

Например, если мы отправляем что-то одному объекту, а затем этот объект забирает это, что-то делает с ним и отправляет это другому и так далее, тогда это реализует цепочку шаблонов ответственности.

Мы можем реализовать это следующим образом:

const backend = {
  receive(data) {
    // do something with data
  }
}
const middleLayer = {
  notify(data) {
    backend.receive(data);
  }
}
const frontEnd = {
  notify(data) {
    middleLayer.notify(data);
  }
}

В приведенном выше коде у нас есть frontEnd, который вызывает метод notify объекта middleLayer, который, в свою очередь, вызывает метод backend ‘s receive.

Таким образом, мы можем беспрепятственно передавать данные между ними одним методом.

Пока мы не предоставляем никаких других методов, которые осуществляют связь между обоими объектами, у нас есть чистый способ передачи данных между frontEnd и middleLayer и backEnd.

Синглтон

В шаблоне singleton мы создаем только один экземпляр объекта.

В JavaScript мы можем создавать объекты с одним экземпляром, создав литерал объекта.

Мы можем создать его, написав:

const obj = {
  foo: 1,
  bar: 'baz'
}

Литерал объекта - это просто набор пар ключ-значение, где значением также могут быть другие объекты.

Если мы используем классы, мы также можем написать:

class Foo {
  constructor() {
    if (!Foo.instance) {
      Foo.instance = {
        foo: 1,
        bar: 2
      }
    }
    return Foo.instance;
  }
}

Мы присвоили созданный экземпляр свойству instance Foo.

Затем, когда мы создаем конструктор, мы проверяем свойство instance, чтобы увидеть, создано ли что-нибудь для него.

Если ему ничего не назначено, мы назначаем ему объект.

Затем мы возвращаем Foo.instance, чтобы получить экземпляр.

Теперь, если мы создадим 2 экземпляра Foo:

const foo = new Foo();
const bar = new Foo();

Затем мы можем увидеть, являются ли они одним и тем же экземпляром, написав:

console.log(foo === bar);

Мы должны получить true, поскольку они оба ссылаются на один и тот же экземпляр.

Синглтоны удобны для создания объектов, которые используются несколькими частями кода для хранения данных в одном месте.

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

Выкройка наилегчайшего веса

В паттерне-легковесе мы ограничиваем создание объектов,

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

Эти объекты находятся за объектом-грузиком, который используется для взаимодействия с этими объектами,

Эти объекты также взаимодействуют с нашим кодом.

Таким образом, мы получаем преимущества большого объекта, в то время как мы взаимодействуем с более мелкими объектами, которые более управляемы.

Например, мы можем реализовать это следующим образом:

class Student {
 //..
}
const studentIdentity = {
 getIdentity(){
   const student = new Student();
    //..
    return {
    //...
    }
  }
}
const studentScore = {
 getScore(){
   const student = new Student();
    //..
    return {
    //...
    }
  }
}

У нас есть Student класс, представляющий данные учащегося.

Затем в объектах studentIdentity и studentScore у нас есть методы для получения его или ее личности или оценки соответственно.

Таким образом, нам не нужно помещать все методы в класс Student.

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

Заключение

Мы можем использовать шаблон singleton для создания одноразовых объектов.

Мы можем создавать экземпляры класса только с одним экземпляром или с объектными литералами.

В паттерне «Легковес» мы создаем более мелкие объекты для работы с большими объектами, тем самым снижая сложность.

Шаблон цепочки ответственности позволяет нам последовательно отправлять данные от одного объекта к другому.