Decorator Design Pattern.
Decorator Design Pattern allows class to extend its functionalities dynamically without changing the actual class implementation.
Decorator Design Pattern Example In Java.
Say we are opening a Cake shop and planning to sell many flavours of cake.
Also, custom cake order will be accepted as per Customer needs.
How to design a class for this purpose. Decorator pattern is helpful for this kind of requirement.
How to design a class for this purpose. Decorator pattern is helpful for this kind of requirement.
Cake.java
interface Cake{ void flavour(); int getAmount(); }BasicCake.java
class BasicCake implements Cake{ @Override public void flavour() { System.out.println("Basic Cake"); } @Override public int getAmount() { return 50; } }CakeDecorator.java (It is made abstract because it is helper class and object of only implementations of it is possible)
abstract class CakeDecorator implements Cake{ private Cake cake; public CakeDecorator(Cake cake) { this.cake = cake; } @Override public void flavour() { cake.flavour(); } @Override public int getAmount() { return cake.getAmount(); } }VanillaCake.java
class VanillaCake extends CakeDecorator{ public VanillaCake(Cake cake) { super(cake); } @Override public void flavour() { super.flavour(); System.out.println("Adding Vanilla falvour"); } @Override public int getAmount() { return super.getAmount() + 10; } }StrawberyCake.java
class StrawberyCake extends CakeDecorator{ public StrawberyCake(Cake cake) { super(cake); } @Override public void flavour() { super.flavour(); System.out.println("Adding Strawberry falvour"); } @Override public int getAmount() { return super.getAmount() + 10; } }DecoratorDesignPattern.java
public class DecoratorDesignPattern { public static void main(String[] args) { VanillaCake vanillaStrawberryCake = new VanillaCake(new StrawberyCake(new BasicCake())); vanillaStrawberryCake.flavour(); System.out.println(vanillaStrawberryCake.getAmount()); } }
Decorator Design Pattern used in JDK API.
Base class
java.io.Reader;
java.io.InputStream;
Decorators:
java.io.BufferedReader(java.io.Reader);
java.io.FileReader(java.io.Reader);
java.io.DataInputStream(java.io.InputStream)
java.io.BufferedInputStream(java.io.InputStream)
Constructor of BufferedReader takes parameter as Reader class and add more few more features like readLine() method, which is specific to BufferedReader class only.
Eg: BufferedReader in = new BufferedReader(new FileReader("foo.in"));
Eg: DataInputStream input = new DataInputStream(new ZipInputStream(new
FileInputStream("foo.zip")));
You may also like to see
Observer Design Pattern
When to use Builder design pattern
Adapter Design Pattern
Command Design Pattern
Enjoy !!!!
If you find any issue in post or face any error while implementing, Please comment.