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.
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