1.12 (디자인 모드) 책임 패턴의 사슬

책임 패턴의 사슬 체인, 수신기 객체 요청 등 수신자의 요청 디커플링을 만듭니다

받는 사람의 특정 구현에 대한 우려없이 추가 요청은받는 사람이 단순히 체인에 요청을 전달합니다.

 

다음은로드 된 클래스의 예를 다음 줄의 클래스 로딩기구 채용 상위 대리인, 일류 BootstrapClassLoader 최상부에,

부하가 BootstrapClassLoader로드 할 수있는 경우,로드되지 않은 경우, 다음 단계 ExtensionClassLoader.로드에 전달,

로딩은 다음 단계 로더 ApplicationClassLoader에게 전달 반대로,로드하는 것입니다 경우.

마지막으로 모든 클래스 로더를로드 할 수 없을 때까지 등등, 클래스 로더는 예외가 발생합니다.

 

 

먼저 우리는 추상 클래스의 클래스 로더 이후 BootstrapClassLoader를 작성, ExtensionClassLoader는 추상 클래스를 상속 등

공공  추상  클래스의 클래스 로더 {
     공공  정적  INT bootstrp = 1. ;
     공공  정적  INT의 EXTENSION = 2 ;
     공공  정적  INT 애플리케이션 '= 3. , 
    
    보호  INT의 우선 순위; // 현재 우선 순위 클래스 로더 
    
    // 다음 단계 로더는 
    보호 클래스 로더 nextClassLoader을, 
    
    공공  보이드 setNextClassLoader (클래스 로더 nextClassLoader) {
         이 본 .nextClassLoader = nextClassLoader; 
    } 
    
    공개  무효runLoader (문자열 클래스 이름, INT의 우선 순위) { 
        에서 System.out.println ( "현재 우선 순위 로더 :"+ 은이 .priority + "- 현재 우선 순위 클래스 :"+ 우선 순위),
         IF ( 다음은이 .priority == 우선 순위) { // 현재 클래스가 설치되어로드 할 수 있습니다 
            로더 (클래스 명); 
        } 다른 { //로드 할 수없는 현재의 클래스 로더 다음 단계로 전달 된 현재의 클래스 로더를 
            IF (! nextClassLoader = 널 (null) ) { // 만약 클래스 로더 그렇지 않으면 예외가 발생합니다, 다음 단계로 전달되는 존재.
                // 에서 System.out.println ( "-"+ this.priority + ":"+ 우선 순위), 
                nextClassLoader.runLoader (클래스 이름, 우선 순위); 
            } 다른{ // 현재로드로드되지 않으며, 후속로드가 null 클래스 로더가 발생합니다되고 실패 
                에서 System.out.println을 ( "클래스 로더 페일" ); 
            } 
        } 
    } 
    공공  추상적  무효 로더 (문자열 클래스 이름); 
}

로더의 우선 순위와 동일 클래스 로더가 로딩되면 호출 우선 순위 클래스를 설정하면, 일류 BootstrapClassLoader에 전송 우선 순위를 갖는다.

그렇지 않으면 nextClassLoader.runLoader (클래스 이름, 우선 순위)를로드하여 다음 단계로 통과하고, 마지막 로더에서 예외가 발생하지.

 

클래스 로더의 서브 클래스는 초기화시 두 가지를 할 필요가있다 :

(1) 현재의 클래스 로더 공법에 의해 지정된 우선 순위

도 2를 참조하면, 다음 setNextClassLoader 상위 클래스로드 체인 구성하여 현재 클래스 로더의 클래스 로더를 지정한다.

 

BootstrapClassLoader 

공용  클래스 BootstrapClassLoader는 확장 클래스 로더 { 
    
    공개 BootstrapClassLoader ( INT의 우선 순위) {
          .priority = 우선 순위; 
    } 
    
    @Override 
    공개  공극 로더 (문자열 클래스 명) {
         // TODO 자동 생성 방법 스텁 
        에서 System.out.println ( "BootstrapClassLoader"+ 클래스 명); 
    } 
    
}

 

 

ExtensionClassLoader

공용  클래스 ExtensionClassLoader는 확장 클래스 로더 { 
    
    공개 ExtensionClassLoader ( INT의 우선 순위) {
          .priority = 우선 순위; 
    } 
    
    @Override 
    공개  공극 로더 (문자열 클래스 명) {
         // TODO 자동 생성 방법 스텁 
        에서 System.out.println ( "ExtensionClassLoader"+ 클래스 명); 
    } 
    
}

 

 

ApplicationClassLoader

공용  클래스 ApplicationClassLoader는 확장 클래스 로더 { 
    
    공개 ApplicationClassLoader ( INT의 우선 순위) {
          .priority = 우선 순위; 
    } 
    
    @Override 
    공개  공극 로더 (문자열 클래스 명) {
         // TODO 자동 생성 방법 스텁 
        에서 System.out.println ( "ApplicationClassLoader"+ 클래스 명); 
    } 
    
}

 

 

본관

공용  클래스 메인 {
     공공  정적 클래스 로더 buildLoaderChain () {
         //는 각 로더의 우선 순위 설정 
        의 ClassLoader bootstrapClassLoader = 새로운 새 BootstrapClassLoader (ClassLoader.BOOTSTRP)를, 
        클래스 로더 extensionClassLoader = 새로운 새 ExtensionClassLoader (ClassLoader.EXTENSION) 
        클래스 로더 applicationClassLoader = 새로운 새 ApplicationClassLoader (ClassLoader.APPLICATION )
         // 설정 부채 체인 bootstrap-> extension-> 애플리케이션, 
         // 우선 123    
         //당신이 그렇게에 확장에 전달하고, 할 수없는 경우 먼저 부트 스트랩 로더에 전달 된 후,로드 할 수 있습니다.
        // 담당 노드 우선 단일 쇄 우선 순위 클래스가로드 된 경우 == 
        
        // 구성된 부하 체인 
        bootstrapClassLoader.setNextClassLoader (extensionClassLoader) 
        extensionClassLoader.setNextClassLoader (applicationClassLoader) 
        반환 bootstrapClassLoader 단계; 
    } 
    
    공공  정적  무효 메인 (문자열 인수 []) { 
        클래스 로더 classLoader가 = buildLoaderChain (); 
        classLoader.runLoader (「bootstrp "ClassLoader.BOOTSTRP)        // . 부트 스트랩 로딩 1 
        classLoader.runLoader ("확장자 "ClassLoader.EXTENSION)        // 확장로드 1-> 2
        classLoader.runLoader ( "응용 프로그램", ClassLoader.APPLICATION); // 애플리케이션加载1-> 2-> 3 
    } 
}    

 

실행 결과 : 
현재 우선 순위 로더 : 현재 클래스 1-- :. 1의 우선 순위 bootstrp의 : BootstrapClassLoader 현재 우선 순위 로더 : 1-- 현재 클래스의 우선 순위 : 2 : 현재 우선 순위 로더 2-- 현재 클래스의 우선 순위 : 2 ExtensionClassLoader : EXTENSION의 현재 우선 로더 : 1-- 현재 클래스의 우선 순위 3 의 현재 우선 로더 : 2-- 현재 클래스의 우선 순위 3 의 현재 우선 로더 : 3-- 현재 클래스의 우선 순위 3 ApplicationClassLoader : 신청

 

참고 :

https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html

추천

출처www.cnblogs.com/huang-changfan/p/10982968.html