Decorator pattern
-이미 존재하는 객체에 대해 새로운 기능을 추가하는 것을 위한 pattern
-structural pattern으로 existing class의 wrapper로써 작동한다.
-decorator class를 작성하며, original class를 wrap하여 새 기능을 추가하고 원래의 structure는 그대로 유지시킨다.
Main 호출 부분
ShapeDecorator를 확장한 RedShapeDecorator를 사용하여 기존의 Circle객체의 기능을 추가하는 것이 가능해졌다.
Circle circle = new Circle(); //existing object circle.draw(); //decorating circle RedShapeDecorator redShapeDecorator1 = new RedShapeDecorator(circle); redShapeDecorator1.draw(); RedShapeDecorator redShapeDecorator2 = new RedShapeDecorator(new Rectangle()); redShapeDecorator2.draw();
ShapeDecorator class가 abstract class 임에 주목
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape { protected Shape decoratorShape; public ShapeDecorator(Shape decoratedShape){ this.decoratorShape=decoratedShape; } @Override public void draw() { decoratorShape.draw(); } }
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator { public RedShapeDecorator(Shape decoratedShape) { super(decoratedShape); } @Override public void draw() { decoratorShape.draw(); setRedBoard(decoratorShape); } private void setRedBoard(Shape decoratorShape) { Log.d(TAG, "Border Color in Red"); } }
나머지
public interface Shape { public static final String TAG = "shape"; void draw(); } public class Rectangle implements Shape { @Override public void draw() { Log.d(TAG, "draw rectangle"); } } public class Circle implements Shape { @Override public void draw() { Log.d(TAG, "draw Circle"); } }
결과 :
07-20 12:00:21.018 8526 8526 D shape : draw Circle
07-20 12:00:21.018 8526 8526 D shape : draw Circle
07-20 12:00:21.018 8526 8526 D shape : Border Color in Red
07-20 12:00:21.018 8526 8526 D shape : draw rectangle
07-20 12:00:21.018 8526 8526 D shape : Border Color in Red
출처 :
https://www.tutorialspoint.com/design_pattern/decorator_pattern.htm
'pattern' 카테고리의 다른 글
Flyweight pattern (0) | 2018.07.20 |
---|---|
Facade Pattern (0) | 2018.07.20 |
uml 기호 정리 (0) | 2018.07.20 |
Composite pattern (0) | 2018.07.19 |
Filter pattern or Criteria pattern (0) | 2018.07.19 |