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 |