15 1 0 4000 1 https://haktanbozer.com.tr 300

Chain of Responsibility Pattern Nedir?

Nesne yönelimli tasarımlarda Chain of Responsibility Pattern modeli, bir komut nesneleri kaynaklarından ve bir dizi işleme nesnelerinden oluşan davranışsal bir tasarım modelidir. Her işleme nesnesi, işleyebileceği komut nesnesi türlerini tanımlayan mantık içermektedir. Zincirdeki geri kalanlar bir sonraki işleme nesnesine iletilir. Bu zincirin sonuna yeni işleme alınacak nesneleri eklemek için bir mekanizma da bulunmaktadır.

 

Chain of Responsibility Pattern modelinin bir varyasyonunda, bazı işleyiciler, çeşitli yönlerde komutlar göndererek bir “Tree of Responsibility” oluşturabilen dağıtım görevlileri olarak hareket edebilir. Bazı durumlarda, örneğin problemin daha küçük bir bölümünü çözmeye çalışan komutlarla daha yüksek işlem nesnelerini çağıran işleme nesneleri ile yinelemeli olarak gerçekleşebilir. Bu durumda özyineleme, komut işlenene veya tüm “tree” kontrol edilene kadar devam eder. Bir XML yorumlayıcısı bu şekilde çalışabilir. Bu model, “Loose Coupling” prensibini destekler.

 

Chain of Responsibility Pattern modeli, yapısal olarak “Decorator Pattern” modeliyle hemen hemen aynıdır. Aralarındaki fark, “Decorator Pattern” modeli için tüm sınıfların talebi işlemesi gerekmektedir. Chain of Responsibility Pattern modeli için ise zincirdeki sınıflardan tam olarak birinin talebi işlemesidir.

 

Chain of Responsibility Pattern modeli, esnek ve yeniden kullanılabilir nesne yönelimli yazılım, kısacası uygulanması daha kolay olan nesneler tasarlarken tekrar eden tasarım sorunlarına yönelik ortak çözümleri tanımlayan, yirmi üç popüler GoF tasarım modelinden biridir.

 

 

Chain of Responsibility Pattern modelini Java kodları ile anlatacak olursak

 

  • Adım 1

 

Abstract olarak “AbstractLogger” adında yeni bir class oluşturalım.

 

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

   //Chain or responsibility modelindeki bir sonraki unsur
   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);   }
  • Adım 2

 

ConsoleLogger adında yeni bir class oluşturalım ve ilk oluşturduğumuz class değerlerini içersin.

 

public class ConsoleLogger extends AbstractLogger {

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

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

 

 

  • Adım 3

 

ErrorLogger adında yeni bir class oluşturalım ve ilk oluşturduğumuz class değerlerini içersin.

 

 

public class ErrorLogger extends AbstractLogger {

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

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

 

 

  • Adım 4

 

FileLogger adında yeni bir class oluşturalım ve ilk oluşturduğumuz class değerlerini içersin.

 

 

public class FileLogger extends AbstractLogger {

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

   @Override
   protected void write(String message) {		
      System.out.println("Dosya::Logger: " + message);
   }
}
  • Adım 5

 

Farklı türde Logger oluşturalım. Logger lara hata seviyeleri atayalım. Her bir Logger bir sonraki Logger değerini ayarlasın. Bunlar zincirin parçalarını temsil etmektedir.

 

 

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,          "Bu bir bilgilendirme mesajıdır.");

      loggerChain.logMessage(AbstractLogger.DEBUG,          " Bu debug level bilgilendirmesidir.");

      loggerChain.logMessage(AbstractLogger.ERROR,          "Bi bir hata mesajıdır.");
   }
}

 

 

  • Adım 6

 

Hazırladığımız kodları çalıştıralım

 

Standard Konsol::Logger: Bu bir bilgilendirme mesajıdır.
Dosya::Logger: Bu debug level bilgilendirmesidir.
Standard Konsol::Logger: Bu debug level bilgilendirmesidir.
Hata Konsol::Logger: Bu bir hata mesajıdır.
Dosya::Logger: Bu bir hata mesajıdır.
Standard Konsol::Logger: Bu bir hata mesajıdır.

 

 

Kaynakça

https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

http://www.canertosuner.com/post/chain-of-responsibility-pattern-nedir1

https://www.tutorialspoint.com/design_pattern/chain_of_responsibility_pattern.htm

Paylaş:
Ulam:Nedir?
Önceki Yazı
YUI CM-1706WE
Sıradaki Yazı
JRE Nedir?