js 조합 모드

17759 단어 디자인 모드
명령 모드 에서 학습 한 기초 위 에서:
더 강 한 매크로 명령

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
    <button id="button">  button>
    <script>
        var MacroCommand = function(){
            return {
                commandsList: [],
                add: function( command ){
                    this.commandsList.push( command );
                },
                execute: function(){
                    for ( var i = 0, command; command = this.commandsList[ i++ ]; ){
                        command.execute();
                    }
                }
            }
        };
        var openAcCommand = {
            execute: function(){
                console.log( '    ' );
            }
        };
        /**********               ,                         
         *********/
        var openTvCommand = {
            execute: function(){
                console.log( '    ' );
            }
        };
        var openSoundCommand = {
            execute: function(){
                console.log( '    ' );
            }
        };
        var macroCommand1 = MacroCommand();
        macroCommand1.add( openTvCommand );
        macroCommand1.add( openSoundCommand );
        /*********  、         QQ    ****************/
        var closeDoorCommand = {
            execute: function(){
                console.log( '  ' );
            }
        };
        var openPcCommand = {
            execute: function(){
                console.log( '   ' );
            }
        };
        var openQQCommand = {
            execute: function(){
                console.log( '   QQ' );
            }
        };
        var macroCommand2 = MacroCommand();
        macroCommand2.add( closeDoorCommand );
        macroCommand2.add( openPcCommand );
        macroCommand2.add( openQQCommand );
        /*********             “    ”**********/
        var macroCommand = MacroCommand();
        macroCommand.add( openAcCommand );
        macroCommand.add( macroCommand1 );
        macroCommand.add( macroCommand2 );
        /*********        “    ”**********/
        var setCommand = (function( command ){
            document.getElementById( 'button' ).onclick = function(){
                command.execute();
            }
        })( macroCommand );
    script>

body>
html>

이 예 에서 볼 수 있 듯 이 기본 적 인 대상 은 더욱 복잡 한 조합 대상 으로 조합 되 고 조합 대상 은 조합 되 어 계속 돌아 갈 수 있다. 이 나무의 구 조 는 임 의적 으로 많은 복잡 도 를 지원 할 수 있다.나무 가 최종 적 으로 구 조 된 후에 나무 전 체 를 최종 적 으로 작 동 시 키 는 절 차 는 매우 간단 하 며 최상 위 대상 의 execute 방법 만 사용 해 야 한다.최상 위 대상 에 게 한 번 씩 요청 할 때마다 실제 적 으로 트 리 전체 에 대해 깊이 있 는 검색 을 하고 있 으 며, 조합 대상 을 만 드 는 프로그래머 는 이러한 내 적 디 테 일 에 관심 이 없 으 며, 이 트 리 에 새로운 노드 대상 을 추가 하 는 것 은 매우 쉬 운 일이 다.
조합 모드 의 예 - 폴 더 스 캔

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
    <button id="button">  button>
    <script>
        /******************************* Folder ******************************/
        var Folder = function( name ){
            this.name = name;
            this.files = [];
        };
        Folder.prototype.add = function( file ){
            this.files.push( file );
        };
        Folder.prototype.scan = function(){
            console.log( '       : ' + this.name );
            for ( var i = 0, file, files = this.files; file = files[ i++ ]; ){
                file.scan();
            }
        };
        /******************************* File ******************************/
        var File = function( name ){
            this.name = name;
        };
        File.prototype.add = function(){
            throw new Error( '           ' );
        };
        File.prototype.scan = function(){
            console.log( '      : ' + this.name );
        };

        var folder = new Folder( '    ' );
        var folder1 = new Folder( 'JavaScript' );
        var folder2 = new Folder ( 'jQuery' );

        var file1 = new File( 'JavaScript          ' );
        var file2 = new File( '   jQuery' );
        var file3 = new File( '     ' )
        folder1.add( file1 );
        folder2.add( file2 );
        folder.add( folder1 );
        folder.add( folder2 );
        folder.add( file3 );
        folder.scan();
    script>

body>
html>

주의 할 점
  • 조합 모델 은 부자 관계 가 아니다
  • 대 엽 대상 조작의 일치 성
  • level 02: 부모 대상 참조
    이전 예 에서 조합 대상 은 아래 의 하위 노드 의 인용 을 저장 했다. 이것 은 조합 모델 의 특징 이다. 이때 나무 구 조 는 위 에서 아래로 이다.그러나 가끔 우 리 는 서브 노드 에서 부모 노드 에 대한 인용 을 유지 해 야 한다. 예 를 들 어 조합 모델 에서 직책 체인 을 사용 할 때 서브 노드 에서 부모 노드 에 거품 을 일 으 켜 전달 해 야 할 수도 있다.그리고 우리 가 어떤 파일 을 삭제 할 때 실제로 이 파일 이 있 는 상위 폴 더 에서 이 파일 을 삭제 합 니 다.
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    head>
    <body>
        <script>
            var Folder = function( name ){
                this.name = name;
                this.parent = null; //   this.parent   
                this.files = [];
            };
            Folder.prototype.add = function( file ){
                file.parent = this; //     
                this.files.push( file );
            };
            Folder.prototype.scan = function(){
                console.log( '       : ' + this.name );
                for ( var i = 0, file, files = this.files; file = files[ i++ ]; ){
                    file.scan();
                }
            };
            Folder.prototype.remove = function(){
                if ( !this.parent ){ //            
                    return;
                }
                for ( var files = this.parent.files, l = files.length - 1; l >=0; l-- ){
                    var file = files[ l ];
                    if ( file === this ){
                        files.splice( l, 1 );
                    }
                }
            };
            var File = function( name ){
                this.name = name;
                this.parent = null;
            };
            File.prototype.add = function(){
                throw new Error( '         ' );
            };
            File.prototype.scan = function(){
                console.log( '      : ' + this.name );
            };
            File.prototype.remove = function(){
                if ( !this.parent ){ //            
                    return;
                }
                for ( var files = this.parent.files, l = files.length - 1; l >=0; l-- ){
                    var file = files[ l ];
                    if ( file === this ){
                        files.splice( l, 1 );
                    }
                }
            };
            var folder = new Folder( '    ' );
            var folder1 = new Folder( 'JavaScript' );
            var file1 = new Folder ( '     Node.js' );
            folder1.add( new File( 'JavaScript          ' ) );
            folder.add( folder1 );
            folder.add( file1 );
            file1.remove();
            folder1.remove(); //     
            folder.scan();
        script>
    body>
    html>

    조합 모드 를 언제 사용 합 니까?
    조합 모델 을 적절하게 운용 하면 고객 의 코드 를 크게 간소화 할 수 있다.일반적으로 조합 모델 은 다음 과 같은 두 가지 상황 에 적용 된다.전체 차원 구조.조합 모델 은 한 그루 의 나 무 를 편리 하 게 구성 하여 대상 의 부분 인 61485 ℃ 의 전체적인 구 조 를 나 타 낼 수 있다.특히 우리 가 개발 하 는 동안 이 나무 가 얼마나 층 이 있 는 지 확실 하지 않 을 때.나무의 구조 가 최종 적 으로 완 성 된 후에 나무의 맨 윗 층 대상 을 요청 하면 나무 전 체 를 통일 적 으로 조작 할 수 있다.조합 모드 에서 트 리 의 노드 를 추가 하고 삭제 하 는 것 이 매우 편리 하 며 개방 * 61485 ° 폐쇄 원칙 에 부합 합 니 다.
    『 61553 』 고객 은 나무의 모든 대상 을 통일 적 으로 대하 기 를 원한 다.조합 모델 은 고객 으로 하여 금 조합 대상 과 잎 대상 의 차 이 를 무시 할 수 있 게 한다. 고객 이 이 나 무 를 직면 할 때 현재 처리 하고 있 는 대상 이 조합 대상 인지 잎 대상 인지 에 관심 을 가지 지 않 아 도 된다. 또한 if, else 문 구 를 써 서 각각 처리 하지 않 아 도 된다.조합 대상 과 잎 대상 은 각자 옳 은 일 을 하 는 것 이 조합 모델 의 가장 중요 한 능력 이다.

    좋은 웹페이지 즐겨찾기