Шаблоны JavaScript Дизайн - долг цепи.

  Цепочка обязанностей является типом конструкции шаблона дизайна поведения режима;

  Определение:

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

   Жаргон объяснение:

   Координаты Ухань, новые города первого эшелона 1000 + миллионов человек, в утренние часы пик автобусы, например, утренний час пик утром, когда автобусы обычно передние двери джемы, которые могут не красть ездить, но некоторые из задней двери будет относительно пустой, затем мы выбрали заднюю дверь на машине, но мы не можем почистить заднюю дверь автомобиля на карте, избежать одного? Она не существует, это не мы, как цивилизованные, есть качество нового поколения молодых людей, должно делать, то, Ван Qianmian мы проходим автобусную карту, с просьбой о помощи перед пассажирами, переданных в считыватель карт на карте, но мы находимся в задней двери, кредитных картах находится на передней двери, проходя в этом процессе мы будем помогать запрос на передачу автобус проходит через несколько пассажиров, процесс передачи является своего рода цепочка обязанностей, пассажир цепь ответственности в каждом объекте узла передается;

  Реализация кода:

  Предположим, у вас есть сайт по продаже мобильных телефонов поставщика электроэнергии, после оплаты 500 юаней соответственно, и 200 юаней депозит Ценообразование двух запланированных (заказов, полученных в это время), теперь достиг стадии формальной покупки. Компания заплатила депозит для клиентов определенной льготной политики. Клиенты в формальной покупке, заплатили депозит в размере 500 юаней будет получать 100 юани магазина купонов, заплатило более $ 200 клиентов получат 50 юаней магазина купонов, и клиенты, которые ранее не заплатили депозит не будет иметь никаких купонов, и ограниченный инвентарь, не обязательно покупать;

  Параметр Определение:

   1.orderType: указывает тип заказа (пользователь или обычных пользователей депозитов), когда значение кода пользователя 1 депозита $ 500, 2 представляет собой время, пользователь является депозит $ 200, так как, когда обычный пользователь 3;

      2.pay: Указывает, может ли пользователь заплатил депозит, значение истина или ложь. В то время как заказы более $ 500 пользователь депозита, но если он не оплатил депозит, и теперь можно приобрести только в качестве обычного пользователя;

      3.stock: представляет количество акций для обычных пользователей, чтобы купить мобильные телефоны, мы заплатили депозит в размере 500 юаней или 200 юаней депозитов клиенты не ограничены;

   Реализация:

вар Order = функция (OrderType, Pay, со) {
     IF (OrderType ===. 1) { // депозит режим 500 юаней для последующего использования 
        IF (Pay === истины ) { // платного депозита 
            console.log ( «500 юаней депозит Предварительно получить 100 купона « ); 
        } в ELSE { // не платить депозит, понижено до нормальных шаблонов покупки 
            IF (со> 0) { // телефон для покупки обыкновенных акций, а также 
                console.log (» общей покупки, нет купон ' ); 

            } еще { 
                console.log ( ' отсутствие сотового телефона инвентаризации ' ); 
            } 
        } 
    } 
    еще IF (OrderType === 2) { // 200 позже режим юаней депозит 
        IF (Pay === истина ) { 
            console.log ( 'предварительно депозит в размере $ 200, чтобы дать купон 50' ); 
        } еще {
             IF (со> 0 ) { 
                console.log ( 'общая покупка, нет купона' ); 
            } еще { 
                console.log ( 'отсутствие сотового телефона инвентаризации' ); 
            } 
        } 
    } 
    еще  IF (OrderType === 3 ) {
         IF (со> 0 ) { 
            console.log ('Обычная покупка, нет купона' ); 
        } еще { 
            console.log ( 'отсутствие клеток инвентаря телефона' ); 
        } 
    } 
}; 
орден ( 1, к истине , 500); //   500 юаней депозита предзаказ, получить 100 купонов

  Конечно, приведенный выше код для достижения требуемой функции, но значительно выше коды структура не ясен и большой метод функций для того, высокой степень сцепления;

  

  Цепь реализации Ответственность шаблона:

   Мы используем цепочку обязанностей для достижения указанных выше функций, мы первые заказы на 500 юаней депозита, депозит в размере $ 200 заказов, заказы делятся на три основные функции, то OrderType, платить, акции этих три параметра прошел, если 500 юаней заказов функция не соответствует условиям процесса, то запрос будет передан к функции линии 200 юаней, 200 юаней, если заказ не отвечает в зависимости от условий обработки, то запрос будет передан к нормальной функции линии;

  

вар order500 = функция (OrderType, Pay, со) {
     IF (OrderType 1 && Pay === ===. истина ) { 
        console.log ( 'предварительно депозит в размере $ 500, чтобы дать 100 купон' ); 
    } еще { 
        order200 (OrderType , Pay, со); // передать запрос порядка 200 юаней 
    } 
}; 
// 200 юаней линии 
вар order200 = функция (OrderType, Pay, со) {
     IF (OrderType === === 2 && Pay истина ) { 
        console.log ( «предварительно депозит $ 200, чтобы дать купон 50» ); 
    } в ELSE {
        orderNormal (OrderType, Pay, со); // передает запрос к нормальной линии 
    } 
}; 
// общая линия для последующего 
вар orderNormal = функция (OrderType, Pay, со) {
     IF (со> 0 ) { 
        console.log ( «Normal покупка, нет купона ' ); 
    } еще { 
        console.log ( ' отсутствие клеток инвентаря телефона ' ); 
    } 
}; 

// результаты испытаний: 
order500 (1, к истинному , 500); // 500 юаней депозита заранее сделать заказ, получить 100 купонов 
order500 (1, ложно , 500); // общая покупка, нет купона 
order500 (2,истина , 500); // 200 юаней депозит предзаказ, получить 500 купонов 
order500 (3, ложь , 500); // общая покупка, нет купона 
order500 (3, ложь , 0); // отсутствие сотового телефона инвентаризации

  После того, как код можно увидеть, что после модификации, структура гораздо яснее, чем раньше, разделить функции и устраняет многие, если-нибудь решение ветви;

  Даже если модифицированный код по-прежнему в нарушении открытого / закрытого принципа, потому что если мы за спросом на изменения, необходимо изменить внутреннюю часть этих функций, это явно не то, что мы хотим;

  Улучшение:

    Мы договорились о том, что первая функция не удовлетворяет условиям для обработки возвращает nextSuccessor, если они отвечают условиям процесса осуществления;

    вар order500 = функция (OrderType, Pay, со) {
     IF (OrderType 1 && Pay === ===. истина ) { 
        в console.log ( 'предварительный депозит в размере $ 500, чтобы дать 100 купон' ); 
    } в другое {
         возвращение «nextSuccessor «; // Я не знаю , кто следующий узел передается обратно на запрос в любом случае 
    } 
}; 

вар order200 = функция (OrderType, Pay, со) {
     IF (OrderType === === 2 && Pay истина ) { 
        Console .log ( «предварительно депозит $ 200, чтобы дать купон 50» ); 
    } в ELSE {
         возврат'NextSuccessor'; // Я не знаю , кто следующий узел передается обратно на запрос в любом случае 
    } 
}; 

вар orderNormal = функция (OrderType, Pay, со) {
     IF (со> 0 ) { 
        console.log ( «Normal позже нет купона ' ); 
    } еще { 
        console.log ( ' телефон недостаточен запас ' ); 
    } 
}; 

вар Chain = функция (Fn) {
     это .fn = Fn,
     это .successor = NULL ; 
}; 

// запрос на передачу к следующему узлу 
Chain.prototype.setNextSuccessor = функции(Преемник) {
     вернуть  это .successor = преемником; 
}; 

// передать запрос к узлу 
Chain.prototype.passRequest = функции () { 

   // метод после получения экземпляров и параметры хранятся в виде массива в виде 
    вар RET = этого . fn.apply ( это , аргументы); 
    console.log (RET); 

    // RET равно nextSuccessor выполнило условие обработки не отвечает вниз 
    IF (RET === «nextSuccessor» ) { 

     // это короткие логические цепи возвращаются, и набор ложно ложно; this.successor если он присутствует, последний возвращает результат выполнения; this.successor , если нет, то он возвращает значение, которое не определено this.nextSuccessor 
        возврат товара  в этом .successor && в этот .successor.passRequest.apply ( это.successor, аргументы); 
    } 
}; 


вар chainOrder500 = новая новая цепь (order500);
 вар chainOrder200 = новая новая цепь (order200);
 вар chainOrderNormal = новая новая цепь (orderNormal);     

// в передаче узел долга цепи 
chainOrder500.setNextSuccessor (chainOrder200); 
chainOrder200.setNextSuccessor (chainOrderNormal); 

chainOrder500.passRequest ( 1,. истина , 500); // 500 юаней депозит предварительно позволить 100 купон 
chainOrder500.passRequest (2, истина , 500); // 200 предварительно юаней депозита, чтобы дать 50 акции купоны 
chainOrder500.passRequest (3,истина , 500); // общая покупка, нет купона 
chainOrder500.passRequest (1, ложь ;, 0) // отсутствие сотового телефона инвентаризации

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

 

вар order300 = функция () {
  // реализация определенное поведение 
}; 

chainOrder300 = newChain (order300); 
chainOrder500.setNextSuccessor (chainOrder300); 
chainOrder300.setNextSuccessor (chainOrder200);

 

 

  чаевые:

    Дополнительные знания: логическое короткое замыкание, хотя это время JS базы знаний, но неизбежно будут забыты, и я пишу эту статью, когда он забыл;

    И установить , чтобы дать ложное FALSE: Если объединение (а) соотношение между первым номером является ложным или нет, прямое возвращаемого значения второго числа;

 

переменная х = а && && Ь с等价于

переменная х = а;
если (а) { 
    х = Ь;
    если (б) { 
       х = с; 
    } 
}

 

    Или устанавливает действительно так: если или установлено (или) отношения, то первый номер действительно прямой возврат к первому номеру, первый номер является вторым прямым возвратом лжи;

вар Х = || Л || В С эквивалентна: 

вар X;
 ЕСЛИ (А) { 
    Х = А; 
} еще  ЕСЛИ (В) { 
    Х = В; 
} еще { 
    Х = С; 
}

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

рекомендация

отwww.cnblogs.com/dengyao-blogs/p/11725141.html