Design Patterns Handbook
  • Introduction
  • Creational Patterns
    • Builder
    • Factory
    • Abstract Factory
    • Factory Method
    • Prototype
    • Singleton
    • Object Pool
    • Revealing Constructor
  • Structural Patterns
    • Adapter
    • Composite
    • Proxy
    • Flyweight
    • Facade
    • Bridge
    • Decorator
    • Private Class Data
  • Behavioral Patterns
    • Template Method
    • Mediator
    • Chain Of Responsibility
    • Observer
    • Strategy
    • Command
    • State
    • Visitor
    • Memento
    • Interpreter
    • Null Object
    • Iterator
    • Middleware
  • Clean Code Patterns
    • Extract Method
    • Clarify Responsibility
    • Remove Duplications
    • Keep Refactoring
    • Always Unit Test
    • Create Data Type
    • Comment to Better Name
    • Consistent Naming
    • If-else over ternary operator
    • Composition over Inheritance
    • Too Many Returns
    • Private to Interface
  • Anti Patterns
    • Big Ball of Mud
    • Singleton
    • Mad Scientist
    • Spaghetti Code
    • It Will Never Happen
    • Error Codes
    • Commented Code
    • Abbreviations
    • Prefixes
    • Over Patternized
    • Generic Interface over Function
Powered by GitBook
On this page

Was this helpful?

  1. Behavioral Patterns

Chain Of Responsibility

Chain of responsibility pattern provides a way to create a linked list or pipeline of objects that might be able solve an issue the pipeline is asked to solve.

Example - Image processor

We want to create processor that will decide itself what algorithm should be executed for an given image type.

interface ImageTransformer {
    void setNext(ImageTransformer transformer);
    void resize(String image);
}

class JpegTransfomer implements ImageTransformer {

    private ImageTransformer next;

    @Override
    public void setNext(ImageTransformer transformer) {
        this.next = transformer;
    }

    @Override
    public void resize(String image) {
        if (image.endsWith(".jpeg")) {
            System.out.println(getClass().getSimpleName() + " is processing: " + image);
        } else {
            if (next != null) {
                next.resize(image);
            }
        }
    }
}

class PngTransfomer implements ImageTransformer {

    private ImageTransformer next;

    @Override
    public void setNext(ImageTransformer transformer) {
        this.next = transformer;
    }

    @Override
    public void resize(String image) {
        if (image.endsWith(".png")) {
            System.out.println(getClass().getSimpleName() + " is processing: " + image);
        } else {
            if (next != null) {
                next.resize(image);
            }
        }
    }
}

Then we can create the cain of image transformers and submit a request to process an image.

ImageTransformer chain = new PngTransfomer();
ImageTransformer jpegTransfomer = new JpegTransfomer();
chain.setNext(jpegTransfomer);

String png = "image.png";
String jpeg = "image.jpeg";

chain.resize(png);
chain.resize(jpeg);

Here is the output.

PngTransfomer is processing: image.png
JpegTransfomer is processing: image.jpeg
PreviousMediatorNextObserver

Last updated 5 years ago

Was this helpful?