According to Gang of Four, “Decouple an abstraction from its implementation so the two can vary independently”. If you did not understand it, it is pretty normal 🙂 Lets discuss it in detail.
Lets understand the definition:
So for any kind of abstraction, we create an interface and implement that interface in a class. Now, our client code uses this interface to call the implemented code. But, every time the interface changes, we need to change the implemented code. How can we de couple the abstraction and its implementation?
We have different types of documents that have print functionality in them and we have created a abstract super class GenericDocument that has this print method.
Now lets say we get a requirement to have a Document to have two different types of printing (ex. remove images while printing). One option is to create a new subclass of that Document and implement print accordingly.
- But what if all documents may need this new type of Print tomorrow? Do we create a new subclass every time?
- What if we get multiple different print types. Should we create a new sub class for each type of document?
To have a generic print that can be used by each type of document if needed, we can create a print helper that can handle each type of print request and this helper can be used by each document’s print method without the need of any new sub class creation for each new print type.
GenericDocument <— Book, Research Paper, Design Document
Create a PrintHelper interface that has two implementations: NormalPrint and PrintWithoutImages implementation.
Now, GenericDocument has PrintHelper passed in the constructor that can be used by each document’s print method solving the whole purpose.
What this pattern did?
Abstraction (GenericDocument) uses Implementor (PrintHelper)
RefinedAbstraction (Book, Research Paper etc.) uses ConcreteImplementor (NormalPrint, PrintWithoutImages)
When to use it?
You have some abstraction (GenericDocument) and some implementations (Book, Research Paper etc.) already existing but you need to add some functionality (Print without images) that can be used by all the implementations, you can go ahead and use bridge pattern.