model rantaian tanggungjawab


Seperti namanya, Corak Rantaian Tanggungjawab mencipta rantaian objek penerima untuk permintaan. Corak ini memisahkan pengirim dan penerima permintaan berdasarkan jenis permintaan. Corak reka bentuk jenis ini ialah corak tingkah laku.


Dalam corak ini, biasanya setiap penerima mengandungi rujukan kepada penerima lain. Jika objek tidak dapat mengendalikan permintaan, maka ia menghantar permintaan yang sama kepada penerima seterusnya, dan seterusnya.

Pengenalan

Niat: Elakkan gandingan penghantar dan penerima permintaan, membolehkan berbilang objek menerima permintaan, dan menyambungkan objek ini ke dalam rantai, Dan permintaan dihantar sepanjang rantai ini sehingga objek mengendalikannya.

Penyelesaian utama: Pemproses pada rantaian tanggungjawab bertanggungjawab untuk memproses permintaan. Pelanggan hanya perlu menghantar permintaan ke rantaian tanggungjawab dan tidak perlu mengambil berat tentang pemprosesan permintaan butiran dan penghantaran permintaan, jadi Rantaian tanggungjawab memisahkan pengirim permintaan daripada pengendali permintaan.

Bila hendak digunakan: Untuk menapis banyak saluran semasa memproses mesej.

Cara menyelesaikan: Semua kelas yang dipintas melaksanakan antara muka bersatu.

Kod kunci: Pengendali mengagregatkan dirinya dalam HanleRequest untuk menentukan sama ada ia sesuai Jika syarat tidak dipenuhi, ia akan diturunkan dan ditetapkan sebelum menyerahkannya kepada siapa.

Contoh aplikasi: 1. "Bergendang dan melintas bunga" dalam Dream of Red Mansions. 2. Acara menggelegak dalam JS. 3. Pemprosesan Pengekodan oleh Apache Tomcat dalam WEB JAVA, pemintas Struts2, dan Penapis jsp servlet.

Kelebihan: 1. Ia memisahkan pengirim dan penerima permintaan. 2. Objek yang dipermudahkan. Objek tidak perlu mengetahui struktur rantai. 3. Meningkatkan fleksibiliti memberikan tanggungjawab kepada objek. Membenarkan penambahan dinamik atau pemadaman tanggungjawab dengan menukar ahli dalam rantaian atau mengalihkan pesanan mereka. 4. Sangat mudah untuk menambah kelas pemprosesan permintaan baharu.

Kelemahan: 1. Tiada jaminan permintaan akan diterima. 2. Prestasi sistem akan terjejas pada tahap tertentu, dan menyusahkan untuk nyahpepijat kod, yang boleh menyebabkan panggilan gelung. 3. Mungkin sukar untuk melihat ciri-ciri masa jalan, yang menghalang penyahpepijatan.

Senario penggunaan: 1 Terdapat berbilang objek yang boleh mengendalikan permintaan yang sama Objek khusus yang mengendalikan permintaan ditentukan secara automatik pada masa jalan. 2. Serahkan permintaan kepada salah satu daripada berbilang objek tanpa menyatakan penerima secara jelas. 3. Sekumpulan objek boleh ditetapkan secara dinamik untuk mengendalikan permintaan.

Nota: Temui banyak aplikasi dalam WEB JAVA.

Pelaksanaan

Kami mencipta kelas abstrak AbstractLogger, dengan tahap pengelogan verbose. Kami kemudian mencipta tiga jenis pembalak, semuanya memanjangkan AbstractLogger. Sama ada tahap setiap mesej pembalak tergolong dalam tahapnya sendiri, jika ya, ia akan dicetak dengan sewajarnya, jika tidak, ia tidak akan dicetak dan mesej akan dihantar kepada pembalak seterusnya.

chain_pattern_uml_diagram.jpg

Langkah 1

Buat kelas logger abstrak.

AbstractLogger.java

public abstract class AbstractLogger {
   public static int INFO = 1;
   public static int DEBUG = 2;
   public static int ERROR = 3;

   protected int level;

   //责任链中的下一个元素
   protected AbstractLogger nextLogger;

   public void setNextLogger(AbstractLogger nextLogger){
      this.nextLogger = nextLogger;
   }

   public void logMessage(int level, String message){
      if(this.level <= level){
         write(message);
      }
      if(nextLogger !=null){
         nextLogger.logMessage(level, message);
      }
   }

   abstract protected void write(String message);
	
}

Langkah 2

Buat kelas entiti yang memanjangkan kelas logger ini.

ConsoleLogger.java

public class ConsoleLogger extends AbstractLogger {

   public ConsoleLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String message) {		
      System.out.println("Standard Console::Logger: " + message);
   }
}

ErrorLogger.java

public class ErrorLogger extends AbstractLogger {

   public ErrorLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String message) {		
      System.out.println("Error Console::Logger: " + message);
   }
}

FileLogger.java

public class FileLogger extends AbstractLogger {

   public FileLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String message) {		
      System.out.println("File::Logger: " + message);
   }
}

Langkah 3

Buat pelbagai jenis pembalak. Beri mereka tahap ralat yang berbeza dan dalam setiap pembalak tetapkan pembalak seterusnya. Pembalak seterusnya dalam setiap pembalak mewakili sebahagian daripada rantaian.

ChainPatternDemo.java

public class ChainPatternDemo {
	
   private static AbstractLogger getChainOfLoggers(){

      AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
      AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
      AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);

      errorLogger.setNextLogger(fileLogger);
      fileLogger.setNextLogger(consoleLogger);

      return errorLogger;	
   }

   public static void main(String[] args) {
      AbstractLogger loggerChain = getChainOfLoggers();

      loggerChain.logMessage(AbstractLogger.INFO, 
         "This is an information.");

      loggerChain.logMessage(AbstractLogger.DEBUG, 
         "This is an debug level information.");

      loggerChain.logMessage(AbstractLogger.ERROR, 
         "This is an error information.");
   }
}

Langkah 4

Sahkan output.

rreeee