Spring/additional

[디자인 패턴] Decorator Pattern(데코레이터 패턴)

sujin7837 2021. 2. 21. 17:18
반응형

데코레이터 패턴에 대한 자세한 설명은 다음 글을 참고하세요. Decorator Pattern(데코레이터 패턴)

 

[Spring] 스프링이 사랑한 디자인 패턴1

[개요] 스프링이 사랑한 디자인 패턴1 1. Adapter Pattern(어댑터 패턴) 2. Proxy Pattern(프록시 패턴) 3. Decorator Pattern(데코레이터 패턴) 스프링이 사랑한 디자인 패턴2 1. Singleton Pattern(싱글턴 패턴)..

sujin7837.tistory.com

데코레이터 패턴의 예시: 도형 그리기

 

구현하려는 로직

-Shape 인터페이스와 Shape 인터페이스를 구현하는 구체적인 클래스들을 만듭니다.

-Shape 인터페이스를 구현하고 Shape 객체를 인스턴스 변수로 갖는 추상 데코레이터 클래스 ShapeDecorator를 만듭니다.

-RedShapeDecorator는 ShapeDecorator를 구현하는 구체적인 클래스입니다.

-demo class인 DecoratorPatternDemo는 Shape 객체를 장식하기 위해 RedShapeDecorator를 사용합니다.

 

구현 단계

[1단계]

인터페이스를 만듭니다.

//Shape.java

public interface Shape {
   void draw();
}

 

[2단계]

동일한 인터페이스를 구현하는 구체적인 클래스들을 만듭니다.

//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");
   }
}

 

[3단계]

Shape 인터페이스를 구현하는 추상 데코레이터 클래스를 만듭니다.

//ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

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

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

 

[4단계]

ShapeDecorator 클래스를 확장하는 구체적인 데코레이터 클래스를 만듭니다.

//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");
   }
}

 

[5단계]

RedShapeDecorator를 사용하여 Shape 객체를 장식합니다.

//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();
   }
}

 

[6단계]

출력 확인

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red
반응형