pattern2018. 7. 20. 12:07

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
Posted by easy16