Sabtu, 26 November 2016

Design Patterns - Decorator Pattern

Design Pattern adalah sebuah solusi untuk menyelesaikan masalah umum yang sering di temui dan dihadapi, yang membentuk sebuah pola (pattern) tertentu dalam membuat sebuah program. Pattern adalah bagaimana mendesain kelas dan bagaimana interaksi yang terjadi antar kelas tersebut sehingga kelas yang kita bangun bisa lebih elegan dan reusable. Ada beberapa  pattern yang populer saat ini yang diciptakan oleh GoF (Gang of Four) yaitu Abstract Factory, Builder, Factory Method, Prototype, Singleton, Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy, Chain of Responbility, Command, Interpreter, Iterator, Mediator, Mementto, Observer, State, Strategy, Template Method, Visitor.

Decorator pattern adalah penambahkan tanggung jawab tambahan secara dinamis untuk objek. Memperluas fungsionalitas obyek bisa dilakukan secara statis (pada saat kompilasi) dengan menggunakan warisan namun mungkin diperlukan untuk memperluas fungsi suatu objek secara dinamis (saat runtime) sebagai objek yang digunakan. Pola dekorator berlaku ketika ada kebutuhan untuk secara dinamis menambahkan serta menghapus tanggung jawab ke kelas, dan ketika subclassing tidak mungkin karena jumlah besar dari subclass yang dapat terjadi. Tujuan dari decorator pattern adalah menciptakan suatu mata rantai objek, dimana setiap objek mempunyai object responsible pada fungsi objek berikutnya. Konteks dari pola ini adalah diinginkan untuk memperkaya behaviour dari suatu class, objek komponen terdekorasi bisa digunakan sama seperti objek komponen biasa, tanggung jawab dari proses dekorasi tidak diinginkan ada pada class komponen, kemungkinan ada proses dekorasi yang ditambahkan di masa depan yang tak bisa diperkirakan dan harus diantisipasi

Implementasi:
Kita akan membuat antar muka untuk object shape dan pengimplementasian concrete classes untuk shape. Kita akan membuat decorator abstract dari class ShapeDecorator dengan Shape interface dan Object Shape sebagai instance variable.


Code:

Shape.java
public interface Shape {
   void draw();
}
 
Rectangle.java
public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}

Circle.java
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Circle");
   }
}

ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   } 
}

RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator {

   public RedShapeDecorator(Shape decoratedShape) {
      super(decoratedShape);  
   }

   @Override
   public void draw() {
      decoratedShape.draw();        
      setRedBorder(decoratedShape);
   }

   private void setRedBorder(Shape decoratedShape){
      System.out.println("Border Color: Red");
   }
}

DecoratorPatternDemo.java
public class DecoratorPatternDemo {
   public static void main(String[] args) {

      Shape circle = new Circle();

      Shape redCircle = new RedShapeDecorator(new Circle());

      Shape redRectangle = new RedShapeDecorator(new Rectangle());
      System.out.println("Circle with normal border");
      circle.draw();

      System.out.println("\nCircle of red border");
      redCircle.draw();

      System.out.println("\nRectangle of red border");
      redRectangle.draw();
   }
}
Output:

Tidak ada komentar:

Posting Komentar