Monday, November 3, 2014

Decorator Pattern

Decorator pattern allows to add new functionality in an existing object without altering its structure.
Example:
Suppose in a sandwich shop, first customer order a sandwich with additional cheese and corn and chicken.
Now, the second customer needs a sandwich with cheese and third customer needs sandwich with chicken only.
Say price list is as follows,
                Sandwich è RS. 30/-
                Additional Chicken è RS. 20/-
                Additional Cheese è RS. 10/-
                Additional Corn è RS. 7/-

Now, for this we can use decorator pattern to make the billing software for sandwich shop.



package com.exmpl.decorator;

public interface Sandwich {
       public int getPrice();
}
============================================================
package com.exmpl.decorator;

public class PlaneSandwich implements Sandwich {

       @Override
       public int getPrice() {
              return 30;
       }
}
============================================================
package com.exmpl.decorator;

/* Make this decorator class as abstract, because no need to define/impleement interface's (Sandwich) "getPrice()" method under this decorator class. It will be overridden under each concrete classes (eg. CheesSandwich, ChickenSandwich etc). */
abstract public class SandwichDecorator  implements Sandwich {
       protected Sandwich specialSandwich;
      
       public SandwichDecorator(Sandwich specialSandwich){
              this.specialSandwich=specialSandwich;
       }
       /*public int getPrice(){
              return specialSandwich.getPrice();
       }*/
}
============================================================
package com.exmpl.decorator;

public class CheesSandwich extends SandwichDecorator{
       public CheesSandwich(Sandwich specialSandwich) {
              super(specialSandwich);
       }
       public int getPrice(){
              return specialSandwich.getPrice() + addCheesPrice();
       }
       private int addCheesPrice() {
              return 10;
       }
}
============================================================
package com.exmpl.decorator;

public class ChickenSandwich extends SandwichDecorator{

       public ChickenSandwich(Sandwich specialSandwich) {
              super(specialSandwich);
       }
       public int getPrice(){
              return specialSandwich.getPrice() + addChickenPrice();
       }
       private int addChickenPrice() {
              return 20;
       }
}
============================================================
package com.exmpl.decorator;

public class CornSandwich extends SandwichDecorator{
       public CornSandwich(Sandwich specialSandwich) {
              super(specialSandwich);
       }
       public int getPrice(){
              return specialSandwich.getPrice() + addCornPrice();
       }
       private int addCornPrice() {
              return 7;
       }
}
============================================================
package com.exmpl.decorator;

public class OrderPriceCheck {

       public static void main(String[] args) {
              // Plane sandwich ............
              Sandwich planeSandwich = new PlaneSandwich();
              System.out.println("Plane sandwich price ==>"
                           + planeSandwich.getPrice());
              // Sandwich with additional cheese and corn and chicken.
              Sandwich planeSandwichWithCheesCornChicken = new CheesSandwich(
                           new CornSandwich(new ChickenSandwich(new PlaneSandwich())));
              System.out
                           .println("Sandwich with additional cheese and corn and chicken ==>"
                                         + planeSandwichWithCheesCornChicken.getPrice());
              // Ssandwich with cheese.
              Sandwich planeSandwichWithChees = new CheesSandwich(new PlaneSandwich());
              System.out.println("Sandwich with additional cheese ==>"
                           + planeSandwichWithChees.getPrice());
              // Ssandwich with corn.
              Sandwich planeSandwichWithCorn = new CornSandwich(new PlaneSandwich());
              System.out.println("Sandwich with additional cheese ==>"
                           + planeSandwichWithCorn.getPrice());
       }
}
============================================================
Output è
Plane sandwich price ==>30
Sandwich with additional cheese and corn and chicken ==>67
Sandwich with additional cheese ==>40

Sandwich with additional cheese ==>37

No comments:

Post a Comment