Chain of Responsibility

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.

Example

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.

Index

Copyright (C) 2008 Steven Fletcher. All rights reserved.