자바 스크립트 디자인 패턴 - 의무 체인.

  책임 패턴 체인은 디자인 패턴 디자인 모드 동작 유형입니다;

  정의 :

  객체가 그것을 처리 할 때까지 물체의 복수의 송신기 및 상기 요청의 수신자 사이의 결합을 방지하기 위해, 상기 요청을 처리 할 수있는 기회는, 처리 요구의 체인 및 요청을 형성하는 이러한 개체는 사슬 전달 ;

   특유의 설명 :

   우한의 좌표, 새로운 1 차 도시 1000 + 만 명,하지만 뒷문 중 일부는 상대적으로 비어, 아침 출근 시간 버스에서, 예를 들어, 아침에 아침 출근 시간은 버스가 없습니다 슬쩍 탈 수 일반적으로 전면 도어 걸림 때 우리는 차에 다시 문을 선택했다, 그러나 우리는 카드에 차의 뒷문을 브러시 수 없습니다 단일 탈출? 다음, 신용 카드 왕 Qianmian 우리가 카드를 카드 리더기에 전송 된 승객의 전면에 도움을 요청, 버스 카드를 통과,하지만 우리는 뒷문에있는, 그것은 문명으로, 어떻게해야 젊은 사람들의 새로운 세대의 특성이있다, 우리 아니라, 존재하지 않는 우리는 전송 요청 버스 여러 승객을 통과 도움이 과정에서 전달 현관에있다, 전송 프로세스가 책임 패턴 체인의 일종이며, 승객은 전달 된 모든 노드 객체의 책임 체인이다;

  코드 구현 :

  당신은 각각 500 위안을 지불 한 후, 휴대 전화, 전기 공급을 판매하는 웹 사이트가 있다고 가정하고이 예정 (이 때 생성 된 주문) 200 위안 보증금 가격, 공식적인 구매의 단계에 도달 지금하고 있습니다. 이 회사는 특정 우대 정책의 고객을 위해 보증금을 지불했다. , 고객은 이전에 보증금이 어떤 쿠폰이 없습니다 지불하지, 공식 구매 고객은, 500 위안 보증금 50 위안 저장소 쿠폰을 받게됩니다 $ 고객은 200 이상 지불 한 100 개 위안 저장소 쿠폰받을 것이다 지불했다 제한된 재고, 반드시 구입;

  매개 변수 정의 :

   1.orderType는 1 $ 보증금 500 사용자의 코드 값, 2 사용자로서 $ 200의 입금되는 시간이 순서 (사용자 또는 사용자의 일반적인 침전물)의 종류를 나타내는 경우에는 일반 사용자 (3);

      2.pay : 사용자가 보증금, 참 또는 거짓의 값을 지불 여부를 나타냅니다. 동안 주문 $ 보증금 500 사용자 이상하지만, 그는 단지 일반 사용자로 구입할 수 있습니다 지금은 보증금을 지불하지 않은 경우;

      3.stock가 : 휴대 전화를 구입하는 일반 사용자를위한 주식의 수를 나타냅니다, 우리 500 위안 예금 고객이 너무 국한되지 않습니다 200위안의 보증금을 지불;

   구현 :

var에 주문 = 기능 (OrderType, 유료, 증권) {
     IF (OrderType ===. 1) { // 나중에 500 위안 예금 모드 
        IF (=== 지불 true로 ) { // 지불 예금 
            을 console.log ( '5백위안 예금 전 100 쿠폰을 얻을 수 ' ); 
        } 다른 { //을 보증금을 지불하지 않은, 정상적인 구매 패턴으로 다운 그레이드 
            IF (증권> 0) { // 보통주의 구매뿐만 아니라에 대한 전화 
                을 console.log ('공통 구매, 아니 쿠폰 ' ); 

            } 다른 { 
                을 console.log ( '휴대폰 재고 '의 부족 ); 
            } 
        } 
    } 
    다른 IF (OrderType === 2) { // 200 나중에 모드 위안 보증금은 
        IF (=== 지불 true로 ) { 
            을 console.log ( '$ 200의 전 입금은 쿠폰 (50)를 제공하는 것입니다' ) 
        } 그렇지 않으면 {
             IF가 (증권> 0 ) { 
                을 console.log ( '공통 구매, 아니 쿠폰' ); 
            } 다른 { 
                을 console.log ( '휴대폰 재고 부족' ); 
            } 
        } 
    } 
    다른  IF (OrderType === 3 ) {
         IF (증권> 0 ) { 
            CONSOLE.LOG ('일반 구매, 아니 쿠폰' ); 
        } 다른 { 
            을 console.log ( '휴대폰 재고 부족' ); 
        } 
    } 
} 
주문 ( 1, true로 , 500); //   500 위안 보증금 사전 주문, 도착 100 개 쿠폰

  물론, 상기 코드는 필요한 기능을 달성하지만, 훨씬 위의 코드 구조는 투명하고 큰 차 함수에있어서, 커플 링 고도 아니다

  

  책임 패턴의 구현 체인 :

   500의 경우 위안의 주문, 우리는 500 위안의 보증금에 대한 우리 처음 주문, 위의 기능을 달성하기 위해 책임 패턴의 체인을 사용하여, $ 주문 200의 보증금, 주문은 일반적으로 세 가지 기능, 다음 orderType, 지불, 재고 전달이 세 개의 매개 변수로 분할된다 처리 조건의 기능을 충족시키지 않는 순서는 다음 요청이 법선 함수로 전달 될 경우 공정 조건을 충족하지 않는 기능이 요청은 기능 라인 200 위안 2백위안를 통과한다;

  

var에 order500 = 기능 (OrderType, 유료, 증권) {
     IF (OrderType 1 개 && 지불 === ===. true로 ) { 
        을 console.log ( '$ 500 미리 보증금 100 쿠폰을주는' ); 
    } 다른 { 
        order200 (OrderType , 페이 재고) //는 순서 200위안 요청을 전달 
    } 
} 
// 2백위안 광고 
VAR의 order200 = 함수 (OrderType, 페이 스톡) {
     IF (OrderType === === 2 && 유료 true로 ) { 
        CONSOLE.LOG ( "$ 200 미리 입금 쿠폰 (50)를 제공하는 것" ) 
    } 다른을 {
        orderNormal (OrderType, 지불, 재고); //이 법선에 요청을 전달 
    } 
}; 
// 나중에 공통 라인 
var에 orderNormal = 기능 (OrderType, 유료, 증권) {
     IF (증권> 0 ) { 
        을 console.log ( '정상 구매, 아니 쿠폰 ' ); 
    } 다른 { 
        을 console.log ( '휴대폰 재고 '의 부족 ;) 
    } 
}; 

// 테스트 결과 : 
order500 (1, true로 , 500); // 500 위안 보증금 사전 주문, 도착 100 개 쿠폰 
order500 (1, 거짓 , 500); // 일반적인 구매없이 쿠폰 
order500 (2,true로 , 500); // 2 백 위안 예금 사전 주문, 도착 500 쿠폰 
order500 (3, 거짓 , 500); // 일반 구매, 아니 쿠폰 
order500 (3, 거짓 , 0); // 휴대폰 재고 부족

  코드 수정 후, 구조가 이전보다 훨씬 명확 것을 알 수있다 후에 기능을 분할하고 많은 경우 - 다른 지점 판단을 제거;

  하더라도 우리는 변화에 대한 수요 뒤에있는 경우는 이러한 기능의 내부를 수정할 필요가 있기 때문에, 수정 된 코드는, 개방 / 폐쇄 원칙에 위배 여전히, 이것은 우리가 원하는 것을 명확하지 않다;

  개량 :

    우리는 처리가 nextSuccessor을 반환을 위해 그들이 구현 프로세스의 조건을 충족하는 경우 첫 번째 함수는 조건을 충족하지 않는 것에 동의;

    var에 order500 = 기능 (OrderType, 유료, 증권) {
     IF (OrderType 1 개 && 지불 === ===. true로 ) { 
        을 console.log ( '$ 500 미리 보증금 100 쿠폰을주는' ); 
    } 다른 {
         반환 'nextSuccessor '; // 나는 다음 노드 어쨌든 다시 요청에 전송 누가 모르는 
    } 
}; 

var에 order200 = 기능 (OrderType, 유료, 증권) {
     IF (OrderType === === 2 && 유료 true로 ) { 
        콘솔 .LOG가 ( "$ 200 미리 입금 쿠폰 (50)를 제공하는 것 ' ); 
    } 다른을 {
         'nextSuccessor'; // 나는 다음 노드 어쨌든 다시 요청에 전송 누가 모르는 
    } 
}; 

var에 orderNormal = 기능 (OrderType, 유료, 증권) {
     IF (증권> 0 ) { 
        을 console.log ( '보통 이상 더 쿠폰 ' ); 
    } 다른 { 
        을 console.log ( '전화 부족 재고 ' ); 
    } 
}; 

var에 체인 = 기능 (FN) {
     다음은이 .fn = FN;
     은이 .successor = 널 (null) ; 
}; 

// 전송 요청 다음 노드에 
Chain.prototype.setNextSuccessor = 함수(후계자) {
     반환  이 본 .successor = 후계자; 
} 

// 노드로 요청을 전달 
Chain.prototype.passRequest = 함수 () { 

   // 메소드 인스턴스를 수신하고, 파라미터의 형식의 배열로 저장 한 후 
    VAR의 RET = 은이 . fn.apply ( 인수) 
    CONSOLE.LOG (RET)를; 

    // RET 동일 nextSuccessor은 처리 조건이 하방 충족하지 수행 한된다 
    IF (RET === 'nextSuccessor를' ) { 

     // 이 단락 논리 되돌아가, 거짓 세트는 거짓이다 this.successor 본 경우, 후자의 복귀의 실행 결과, this.successor없는 그것이 this.nextSuccessor 정의되지 않은 값을 반환하는 경우 
        복귀에게  이것을 .successor && 이 본 .successor.passRequest.apply을 ( ; 인수) .successor 
    } 
} 


VAR의 chainOrder500 = 새로운 새로운 체인 (order500)
 VAR의 chainOrder200 = 새로운 새로운 체인 (order200)
 VAR의 chainOrderNormal = 새로운 새로운 사슬 (orderNormal)     

// 듀티 연쇄 이동 노드에 
chainOrder500.setNextSuccessor (chainOrder200); 
chainOrder200.setNextSuccessor (chainOrderNormal) 

chainOrder500.passRequest ( 1. 참으로 , 500); // 500 원 예금 미리 100 쿠폰 수득 
(2 chainOrder500.passRequest를 true로 , 500); // 200 50 프로모션을 제공하는, 미리 원 입금 인 쿠폰 
chainOrder500.passRequest (3,true로 , 500); // 일반 구매, 아니 쿠폰 
chainOrder500.passRequest (1, 거짓 , 0) // 휴대폰 재고 부족

   심지어 우리가 쉽게 처리 할 수 ​​변경 주문 (300)의 보증금을 표시하는 대한 수요 뒤에, 개선의 채택 후,

 

VAR의 order300 = 함수 () {
  // 구현 특정 동작 
} 

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

 

 

  팁 :

    추가 지식 : 논리적 단락은,이 시간 JS 지식 기반 있지만, 그러나 불가피하게 잊어 버린 것, 그리고 그가 잊었 때이 글을 쓰고 있어요;

    그리고 거짓 거짓을 수득 설정 : 유니온 (및) 제 개수 사이의 관계가 제 번호 본 거짓 여부를 직접 리턴 값 인 경우;

 

VAR의 X가 B를 && && = C等价于

VAR X는 = 단계;
경우 (a) { 
    X = B;
    경우 (b) { 
       의 X =의 C; 
    } 
}

 

    아니면 정말 진정한 설정 : 설정되어있는 경우 또는 (나)의 관계는 다음 첫 번째 숫자는 정말 첫 번째 숫자에 직접 반환하고, 첫 번째 숫자가 두 번째 직접 반환 거짓;

VAR X || = || B C는 동등하다 : 

VAR의 X,
 IF (A) { 
    X = a 및 
} 다른  IF (B) { 
    X = B; 
} 밖의 { 
    X = C; 
}

     이 단락의 기본 논리를 사용에 숙련 될 수 있습니다, 두 문장 위의 굵은 기억;

추천

출처www.cnblogs.com/dengyao-blogs/p/11725141.html