در این قسمت تیم کدگیت را با آموزش Chain Of Responsibility پترن در جاوا همراهی کنید. پیش نیاز این آموزش شامل موارد زیر است:
Behavioral Design Pattern
یکی از زیر شاخههای دیزاین پترن Behavioral Design Pattern میباشد. یکی از وظایف اصلی این دیزاین پترن، تعامل اشیا و جداسازی وظایف آنها با یکدیگر است. تعریف کامل Behavioral Design Pattern بدین صورت است که، تمامی اشیا با یکدیگر به راحتی بتوانند ارتباط برقرار کرده، بدون آنکه باعث وابستگی بین آنها شود.
Chain of Responsibility پترن در جاوا
همانطور که از نام پترن Chain Of Responsibility مشخص است، این پترن تعدادی شی دریافت کننده برای درخواستی را میسازد. در این پترن کلاسهای دریافت کننده و درخواست کننده بر اساس نوع درخواست از یکدیگر جدا میشوند. همچنین Chain Of Responsibility پترن یکی از انواع Behavioral Design Pattern میباشد.
![](https://codegate.ir/wp-content/uploads/2017/04/Chain-Of-Responsibility-diagram-www.codegate.ir_.jpg)
مثال Chain of Responsibility پترن در جاوا
یک کلاس Abstract به نام AbstractLogger داریم که سه کلاس FileLogger و ConsoleLogger و ErrorLogger از آن ارث بری میکنند. در کلاس AbstractLogger برای هر نوع لاگ یک امتیاز در نظر گرفتیم (سه فیلد استاتیک تعریف شده است). پس از دیدن کدها به توضیح جزییات آنها میپردازیم:
public abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
// next element in chain or responsibility
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);
}
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);
}
}
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);
}
}
public class FileLogger extends AbstractLogger {
public FileLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File::Logger: " + message);
}
}
در کلاس AbstractLogger یک فیلد به نام NextLogger وجود دارد که مشخص کننده کلاس دریافت کننده بعدی میباشد و همچنین متدی به نام LogMessage وجود دارد که درخواست را دریافت کرده و در صورتی که امتیاز لاگ درخواست کننده کوچکتر یا مساوی لاگ حاضر باشد آن را چاپ و به دریافت کننده بعدی منتقل میکند.
تست Chain Of Responsibility پترن
برای تست کدهای بالا، کد Main زیر را بزنید:
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.");
}
}
در کد بالا متدی به نام GetChainofLoggers داریم که لاگ ها را تنظیم میکند و در Main با ارسال درخواست ، لاگ هایی که وظیفه دریافت درخواست را دارند آن را دریافت میکنند. توجه داشته باشید که ممکن است چند لاگ دریافت کننده باشند (بر اساس تنظیم امتیاز آنها).