1.12(デザインモード)Chain of Responsibilityパターン

責任のパターンのチェーンチェーンは、レシーバ・オブジェクト要求は、受信者のこのようなデカップリングリクエスタを作成し、

受信者の特定の実装を気にすることなく、更に要求者は、受信者は、単にチェーンに要求を渡します。

 

以下は、ロードされたクラス、ファーストクラスの最上位BootstrapClassLoaderに、親委譲を用いクラスローディング機構の一例を与えます

負荷がBootstrapClassLoaderをロードすることができますされている場合は、ロードされていない場合は、次のステージExtensionClassLoader。ロードに渡され、

ロードは、次のステージローダーApplicationClassLoaderに渡さ逆に、ロードすることである場合。

最終的にはすべてのクラスローダがロードできないまで、というように、クラスローダは、例外がスローされます。

 

 

まず、私たちは抽象クラスのクラスローダ以降のBootstrapClassLoaderを作成し、ExtensionClassLoaderは抽象クラスを継承など

パブリック 抽象 クラスのClassLoader {
     パブリック 静的 INT bootstrp = 1 ;
     公共の 静的 int型の EXTENSION = 2 ;
     公共の 静的 INT APPLICATION = 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(クラス名、優先順位)をロードすることによって、次のステージに通過し、最終的にローダ下で例外がスローされません。

 

クラスローダのサブクラスは、初期化時に2つのことを行う必要があります:

図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)
        のClassLoader 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( "EXTENSION"、ClassLoader.EXTENSION);        // 拡張ローディング1-> 2
        classLoader.runLoader( "APPLICATION"、ClassLoader.APPLICATION)。// アプリケーション加载1-> 2-> 3 
    } 
}    

 

実行結果:
現在の優先度のローダー:現在のクラス1-- :. 1の優先順位 bootstrpの:BootstrapClassLoader 現在の優先度のローダー: 1--現在のクラスの優先順位:2 :現在の優先度のローダー 2--現在のクラスの優先順位: 2 ExtensionClassLoader:拡張 現在の優先順位のローダ: 1--現在のクラスの優先順位:3 現在の優先順位のローダ: 2--現在のクラスの優先順位:3 現在の優先順位のローダ: 3--現在のクラスの優先順位:3 ApplicationClassLoader :APPLICATION

 

参考文献:

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

おすすめ

転載: www.cnblogs.com/huang-changfan/p/10982968.html