


Definition: The chain of responsibility pattern allows more than one object to handle a request.
Usage: Use the chain of responsibility pattern allow multiple objects to attempt to handle a request and then pass on the request if they can't handle it.
abstract class DataFileLoader {
DataFileLoader(DataFileLoader successor) {
this.successor = successor;
}
loadFile(File) {
if(successor != null)
successor.loadFile(file);
}
DataFileLoader successor;
}
class CompressedDataFileLoader extends DataFileLoader {
CompressedDataFileLoader(DataFileLoader successor,
DataFileLoader decompressedFileLoader)
{
super(successor);
this.decompressedFileLoader = decompressedFileLoader;
}
loadFile(File file) {
analyze the file to determine if it is compressed
if(file is compressed) {
File decompressedFile = decompress the file;
decompressedFileLoader.loadFile(decompressedFile);
} else
successor.loadFile(event);
}
DataFileLoader decompressedFileLoader;
}
class ImageDataFileLoader extends DataFileLoader {
ImageDataFileLoader(DataFileLoader successor) {
super(successor);
}
loadFile(File file) {
analyze the file to determine if it is an image
if(file is an image)
load file
else
successor.loadFile(event);
}
}
class TextDataFileLoader extends DataFileLoader {
TextDataFileLoader(DataFileLoader successor) {
super(successor);
}
loadFile(File file) {
analyze the file to determine if it is text
if(file is text)
load file
else
successor.loadFile(event);
}
}
class FileDisplayer {
FileDisplayer(File file) {
DataFileLoader decompressedFileLoader = new ImageDataFileLoader(
new TextDataFileLoader(null));
DataFileLoader loader = new CompressedDataFileLoader(decompressedFileLoader,
decompressedFileLoader);
loader.loadFile(file);
//now display the file
}
}
The FileDisplayer class takes a File of unknown type and tries to load it. To load the file, it must figure out what type of file it is first. The best classes to do this are the FileLoader classes, so it delegates responsibility to them. Rather than having a nested if-else structure with some kind of isFileOfThisType() method, the Chain of Responsibility pattern is used.
Copyright (C) 2008 Steven Fletcher. All rights reserved.