03 에이전트, 교체기

5688 단어 교체기

프록시 모드

  • 대상에게 대용품이나 자리 차지 문자를 제공한다.그의 방문을 통제하기 위해;

  • 개체 중심 설계 원칙 - 단일 책임 원칙
  • 하나의 클래스(대상, 함수)에 대해 말하자면 그의 변화를 일으키는 원인은 하나밖에 없을 것이다.(저결합)
  • 대리와 본체 핑계의 일치성

  • 에이전트가 필요 없을 때 본체로 바꿀 수 있음
  • 보호 에이전트

  • 요청 필터하기;서로 다른 권한 대상이 목표 대상에 대한 접근을 제어하는 데 사용할 수 있음
  • 가상 에이전트

  • 비용이 많이 드는 대상을 진정으로 필요할 때까지 늦추어 만든다.
  • 이미지 사전 로드 가능
  • var myImage = (function() {
      var imgNode = document.createElement('img');
      document.body.appendChild(imgNode);
      return function(src) {
        imgNode.src = src;
      };
    
    })();
    
    var proxyImage = (function() {
      var img = new Image;
      img.onload = function() {
        myImage(this.src);
      };
      return function(src) {
        myImage('picture/loading.jpg');
        img.src = src;
      }
    })();
    
    proxyImage('http://tp3.sinaimg.cn/1805666510/180/5718258464/1');
  • 합병 요청 실현
  • var synchronousFile = function (id) {
      console.log('  ' + id);
    };
    
    var proxySynchronousFile = (function() {
      var cache = [], timer;
      return function(id) {
        cache.push(id);
        if(timer)
          return;
        timer = setTimeout(function() {
          synchronousFile(cache.join(','));
          clearTimeout(timer);
          timer = null;
          cache.length = 0;
        }, 2000);  //2 
      };
    })();
    
    var checkbox = document.getElementsByTagName('input');
    for(var i = 0, c; c = checkbox[i++];) {
      c.onclick = function() {
        if(this.checked === true)
          proxySynchronousFile(this.id);
      }
    };
    

    타성 로드에서의 응용

    var miniConsole = (function(){
      var cache = [];
      var handler = function( ev ){
        if ( ev.keyCode === 13 ){ //enter
          var script = document.createElement( 'script' );
          script.onload = function(){
            for ( var i = 0, fn; fn = cache[ i++ ]; ){
              fn();
            }
          };
          script.src = 'log.js';
          document.getElementsByTagName( 'head' )[0].appendChild(script);
          document.body.removeEventListener( 'keydown', handler );
        }
      };
      document.body.addEventListener( 'keydown', handler, false );
      return {
        log: function(){
          var args = arguments;
          cache.push( function(){
            return miniConsole.log.apply( miniConsole, args );  // , log.js ;
          });
        }
      }
    })();
    
    
    miniConsole.log(0);
    miniConsole.log(1);
    // enter
    
    // log.js  
    miniConsole = {
      log: function(){
      //  
        console.log( Array.prototype.join.call( arguments ) );
      }
    };

    캐시 에이전트

  • 비용이 많이 드는 연산 결과에 일시적인 저장소를 제공
  • var mult = function () {
      var a = 1;
      for(var i = 0, len = arguments.length; i < len; i++)
        a = a * arguments[i];
      return a;
    };
    
    var proxyMult = (function() {
      var cache = {};
      return function() {
        var args = [].join.call(arguments, ',');
        if(args in cache)
          return cache[args]
        return cache[args] = mult.apply(this, arguments);
      };
    })();
    
    proxyMult(3,6,8);
  • aax 비동기 요청에 사용: 페이지를 나눌 때 데이터 캐시를 말하고 다음에 같은 페이지를 요청해서 출력한다.

  • 고급 함수를 이용하여 동적 프록시 만들기

  • 위의 proxyMult를 수정하면 앞으로 유사한 계산의 캐시 에이전트가 같은 함수로 생성됩니다
  • var createProxyFactory = function(fn) {
      var cache = {};
      return function() {
        var args = [].join.call(arguments, ',');
        if(args in cache)
          return cache[args];
        return cache[args] = fn.apply(this, arguments);
      }
    };
    
    var proxyMult = createProxyFactory(mult);
    

    기타 에이전트

  • 방화벽 에이전트: 네트워크 자원의 접근을 제어한다.
  • 원격 에이전트: 한 대상이 서로 다른 주소 공간에 국부 대표를 제공한다.
  • 보호 에이전트: 대상에 사용할 때 서로 다른 접근 권한이 있어야 하는 경우.
  • 스마트 인용 에이전트: 간단한 지침을 대체하고 대상을 방문할 때 추가 조작을 실행한다.
  • 쓸 때 복사 에이전트: 보통 거대한 대상을 복제하는 데 쓰인다.그는 대상이 진정으로 수정되었을 때 복제하는 과정을 지연시켰다.
  • 업무 코드를 작성할 때 사용 에이전트 모델을 미리 설정하지 않아도 되고 특정한 대상에 직접 접근하기 불편할 때 사용한다.

  • 반복자 모드

  • 한 집합 대상의 각 요소를 순서대로 방문하고 이 대상의 내부 표시 방법을 노출할 필요가 없다.
  • 현재 유행하는 대부분의 언어는 내장된 교체기로 이루어진다.JS의 경우Array.prototype.forEach
  • 내부 교체기

  • 내부에 교체 규칙이 정의되어 있음
  • var each = function (arr, callback) {
      for(var i = 0, len = arr.length; i < len; i++)
        callback.call(arr, i, arr[i]); // 
    };
    
    each([1,2,3], function(index, value) {
      console.log(this,index,value);
    });

    외부 교체기

  • 다음 요소를 교체할 것을 표시해야 한다.복잡도를 증가시켰지만 교체기의 유연성을 강화했다.수동으로 교체 과정을 제어할 수 있다.
  • var Iterator = function(obj) {
      var current = 0, len = obj.length;
      var next = function() {
        current++;
      }
      var isDone = function() {
        return current >= len; // length 
      }
      var getCurrentIten = function() {
        return obj[current];
      }
      return {
        next: next,
        isDone: isDone,
        getCurrentIten: getCurrentIten
      }
    };
    // 
    var compare = function(iterator1, iterator2) {
      while(!iterator1.isDone() || !iterator2.isDone()) {
        if(iterator1.getCurrentIten() !== iterator2.getCurrentIten())
          throw new Error(' ');
        iterator1.next();
        iterator2.next();
      }
      console.log(' ');
    };
    
    compare(Iterator([0,1,2]), Iterator([0,1,2]));

    반복 클래스 그룹과 글꼴 크기 대상

  • 실제로는 집합 대상이 length 속성을 가지고 하표로 접근할 수 있으면 교체될 수 있다
  • 응용 예

  • 예를 들어 하나의 기능에서 사용try-catch,if-else 등 실제 상황에 따라 서로 다른 집행 함수를 시도한다.
  • 는 모든 시도할 함수를 단독으로 분리하고 시도 실패 반환을 설정할 수 있다false.
  • 모든 시도할 함수를 고교체기를 통해 집행하고 이후에 새로운 집행 함수를 추가하여 일정한 순서에 따라 교체하면 된다.
  • var iterator = function() {
      for(var i = 0, fn; fn = arguments[i++];) {
        var result = fn();
        if(result !== false)
          return result;
      }
    };
    
    iterator(fn1, fn2, fn3, fn4);

    좋은 웹페이지 즐겨찾기