데코레이터 디자인 패턴을 사용하면 동일한 클래스의 객체 동작에 영향을 주지 않고 객체에 동적으로 기능을 추가할 수 있습니다. 약간 혼란스럽게 들리지만 일단 코드를 보면 모든 것이 더 명확해질 것입니다. 특징 - 데코레이터를 사용하면 구조를 변경하지 않고 기존 객체에 기능을 추가할 수 있습니다. 즉, 원래 클래스는 변경되지 않습니다. - 데코레이터 디자인 패턴은 기존 클래스에 대한 래퍼를 제공하는 구조적 패턴입니다. - 데코레이터 클래스는 다음과 같이 생성됩니다. 원본 클래스를 래핑하고 원본 클래스의 메서드 시그니처를 그대로 유지하면서 추가 기능을 제공합니다. - 데코레이터 디자인 패턴은 추가 책임이 있는 원본 클래스를 로드하지 않고 나누기 때문에 SOLID의 단일 책임 원칙을 따르는 데 가장 자주 사용됩니다. 데코레이터 클래스로 - 데코레이터는 구조적으로 책임 사슬 패턴(chain of Responsibility)과 거의 유사합니다. 다음 핵심 사항을 고려해야 합니다 . - 데코레이터는 런타임 중에 객체의 동작을 수정하는 데 유용합니다. 이 코드는 유지 관리 및 확장이 쉽습니다. - 이 패턴의 단점은 동일한 유형의 데코레이터 객체가 많이 사용된다는 것입니다. - 데코레이터 패턴은 Java IO 클래스(FileReader, BufferedReader 등)에서 자주 사용됩니다. 우리가 할 일 - 인터페이스 생성 - 콘크리트 생성 이 인터페이스의 구현 - 이 인터페이스를 구현하는 추상 데코레이터 만들기 - 추상 데코레이터에서 상속되는 구체적인 데코레이터를 만들어 보겠습니다. - 구체적인 데코레이터를 사용하여 인터페이스의 구체적인 구현을 "장식"합니다. 구현 : Shape 인터페이스와 구체적인 클래스를 만듭니다. 이 인터페이스를 구현하는 것입니다. 다음으로 Shape 인터페이스를 구현하고 Shape 개체를 클래스 필드로 갖는 추상 데코레이터 클래스인 ShapeDecorator를 만듭니다. - Shape는 인터페이스의 이름입니다. - Rectangle, Triangle 및 Circle 클래스는 Shape 인터페이스를 구현하는 구체적인 클래스입니다. - ShapeDecorator는 동일한 Shape 인터페이스를 구현하는 추상 데코레이터 클래스입니다. - RedShapeDecorator는 ShapeDecorator를 구현하는 구체적인 클래스입니다. - Demo는 RedShapeDecorator를 사용하여 Shape 객체를 장식하는 데모 클래스 1단계 : Shape 인터페이스 생성
public interface Shape {
void draw();
}
2단계 : 이 인터페이스의 여러 구현을 만들어 보겠습니다. 아래 예에서는 원만 있지만 실제로는 직사각형과 삼각형이라는 몇 가지를 더 만듭니다.
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Я круг!");
}
}
3단계 : Shape 인터페이스를 구현하는 추상 데코레이터 만들기
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
//Конструктор, принимающий an object Shape
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
4단계 : 추상 클래스에서 상속되는 구체적인 데코레이터 클래스 만들기
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("Сообщение от RedShapeDecorator. Цвет границы: красный");
}
}
5단계 : RedShapeDecorator를 사용하여 개체 색상 지정
public class Demo {
public static void main(String[] args)
{
Shape circle = new Circle();
Shape redCircle= new RedShapeDecorator(new Circle());
Shape redRectangle= new RedShapeDecorator(new Rectangle());
Shape redTriangle = new RedShapeDecorator(new Triangle());
System.out.println("\nОбычный круг:");
circle.draw();
System.out.println("\nКруг с красной границей:");
redCircle.draw();
System.out.println("\nПрямоугольник с красной границей:");
redRectangle.draw();
System.out.println("\nТреугольник с красной границей:");
redTriangle.draw();
}
}
6단계 : 콘솔을 보고 기뻐하세요.
Обычный круг:
Я круг!
Круг с красной границей:
Я круг!
Сообщение от RedShapeDecorator. Цвет границы: красный
Прямоугольник с красной границей:
Я прямоугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
Треугольник с красной границей:
Я треугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
예를 들어 데코레이터 디자인 패턴을 분석한 결과 다음과 같은 경우에 그 사용이 정당하다는 결론을 내릴 수 있습니다. - 객체의 동작이나 상태를 추가, 개선 또는 제거하려는 경우 - 단순히 기능을 변경하려는 경우 클래스의 특정 개체 하나만 선택하고 나머지는 변경하지 않고 그대로 두세요. 감사합니다! 프로젝트 파일이 있는 저장소 geeksforgeeks.org 사이트의 기사를 기반으로 함 초보자 Java Dev를 위한 내 블로그
GO TO FULL VERSION