Latest web development tutorials

Rantai pola tanggung jawab

Seperti namanya, Rantai pola Tanggung Jawab (Rantai Pola Responsibility) untuk permintaan untuk menciptakan sebuah rantai dari objek penerima. Jenis pola yang diberikan dengan permintaan, pengirim dan penerima permintaan decoupling. Jenis pola desain milik pola perilaku.

Dalam mode ini, setiap penerima biasanya berisi referensi ke penerima lain. Jika suatu benda tidak dapat memproses permintaan, maka akan permintaan yang sama kepada penerima berikutnya, dan seterusnya.

pengenalan

Maksud: Hindari meminta pengirim dan penerima digabungkan bersama sehingga beberapa objek cenderung menerima permintaan, benda-benda ini akan terhubung ke sebuah rantai, dan lulus permintaan sepanjang rantai sampai obyek menangani sejauh ini.

Processor Processor tugas rantai bertanggung jawab untuk menangani permintaan, pelanggan hanya perlu mengirimkan permintaan ke rantai tanggung jawab dapat, tidak perlu perhatian transfer request rincian pengolahan dan permintaan, sehingga rantai tanggung jawab dan permintaanpermintaan pengirim: solusi utama dipisahkan.

Kapan menggunakan: ketika berhadapan dengan banyak jalan untuk menyaring pesan.

Cara untuk memperbaiki: kelas intersepsi mengimplementasikan antarmuka yang seragam.

Kode kunci: Handler dalam polimerisasi itu sendiri, di HanleRequest mana yang tepat untuk menentukan apakah, jika kondisi diturunkan tidak sampai, sebelum yang masuk ke set.

contoh aplikasi: 1, The Dream of Red Mansions "Drumming lulus untuk menghabiskan."2, peristiwa JS menggelegak. 3, JAVA WEB Encoding di Apache Tomcat untuk pengolahan, Struts2 interceptor, jsp servlet Filter.

Keuntungan: 1, mengurangi kopling.Ini permintaan pengirim dan penerima decoupling. 2, objek disederhanakan. Sehingga objek tidak perlu mengetahui struktur rantai. 3, untuk meningkatkan fleksibilitas dari tanggung jawab objek ditugaskan. Dengan mengubah anggota rantai atau memobilisasi pesanan mereka, yang memungkinkan add dinamis atau menghapus kewajiban. 4, menambahkan kelas permintaan handler baru sangat nyaman.

Kekurangan: 1, tidak dapat menjamin bahwa permintaan harus diterima.2, kinerja sistem akan terpengaruh, tapi kurang nyaman selama debugging kode dapat menyebabkan panggilan siklus. 3, mungkin tidak karakteristik mudah diamati runtime menghambat debugging.

Penggunaan skenario: 1, lebih dari satu objek dapat menangani permintaan yang sama, khususnya yang keberatan dengan memproses permintaan secara otomatis ditentukan oleh waktu berjalan.2, tanpa secara eksplisit menentukan penerima untuk mengirimkan permintaan ke sejumlah objek. 3, satu set objek dapat ditetapkan secara dinamis untuk memproses permintaan tersebut.

Catatan: ditemui dalam banyak aplikasi di JAWA WEB.

realisasi

Kami membuatAbstractLoggerkelasabstrak,dengan tingkat penebangan rinci. Kami kemudian membuat tiga jenis perekam diperluasAbstractLogger.Setiap pesan tingkat logger apakah tingkat mereka sendiri, jika kemudian dicetak sesuai, jika tidak maka tidak akan mencetak pesan ke depan dan perekam.

Rantai pola Responsibility UML diagram

Langkah 1

Buat catatan kelas abstrak.

AbstractLogger.java

kelas abstrak publik AbstractLogger {
   public static int INFO = 1;
   public static int DEBUG = 2;
   public static int ERROR = 3;

   tingkat int dilindungi;

   // Rantai tanggung jawab dalam elemen berikutnya dilindungi AbstractLogger nextLogger;

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

   public void logMessage (tingkat int, String pesan) {
      jika (this.level <level =) {
         menulis (pesan);
      }
      jika (nextLogger! = null) {
         nextLogger.logMessage (tingkat, pesan);
      }
   }

   abstrak void dilindungi write (String pesan);
	
}

Langkah 2

Membuat kelas entitas yang memperpanjang kelas rekaman.

ConsoleLogger.java

public class ConsoleLogger meluas AbstractLogger {

   publik ConsoleLogger (tingkat int) {
      this.level = tingkat;
   }

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

ErrorLogger.java

public class ErrorLogger meluas AbstractLogger {

   publik ErrorLogger (tingkat int) {
      this.level = tingkat;
   }

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

FileLogger.java

public class FileLogger meluas AbstractLogger {

   publik FileLogger (tingkat int) {
      this.level = tingkat;
   }

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

Langkah 3

Membuat berbagai jenis perekam. Beri mereka berbagai tingkat kesalahan, dan menetapkan rekor di setiap perekam. Setiap perekam logger perwakilan berikutnya adalah bagian dari rantai.

ChainPatternDemo.java

public class ChainPatternDemo {
	
   private static getChainOfLoggers AbstractLogger () {

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

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

      kembali errorLogger;	
   }

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

      loggerChain.logMessage (AbstractLogger.INFO, 
         "Ini adalah informasi.");

      loggerChain.logMessage (AbstractLogger.DEBUG, 
         "Ini adalah informasi tingkat debug.");

      loggerChain.logMessage (AbstractLogger.ERROR, 
         "Ini adalah kesalahan informasi.");
   }
}

Langkah 4

Verifikasi output.

Standard Console :: Logger: Ini adalah informasi.
File :: Logger: Ini adalah informasi tingkat debug.
Standard Console :: Logger: Ini adalah informasi tingkat debug.
Kesalahan Console :: Logger: Ini adalah kesalahan informasi.
File :: Logger: Ini adalah kesalahan informasi.
Standard Console :: Logger: Ini adalah kesalahan informasi.