JavaRush /Java Blog /Random-KO /예제가 포함된 데코레이터 디자인 패턴
Sbv239
레벨 23
Санкт-Петербург

예제가 포함된 데코레이터 디자인 패턴

Random-KO 그룹에 게시되었습니다
데코레이터 디자인 패턴을 사용하면 동일한 클래스의 객체 동작에 영향을 주지 않고 객체에 동적으로 기능을 추가할 수 있습니다. 약간 혼란스럽게 들리지만 일단 코드를 보면 모든 것이 더 명확해질 것입니다. 특징 - 데코레이터를 사용하면 구조를 변경하지 않고 기존 객체에 기능을 추가할 수 있습니다. 즉, 원래 클래스는 변경되지 않습니다. - 데코레이터 디자인 패턴은 기존 클래스에 대한 래퍼를 제공하는 구조적 패턴입니다. - 데코레이터 클래스는 다음과 같이 생성됩니다. 원본 클래스를 래핑하고 원본 클래스의 메서드 시그니처를 그대로 유지하면서 추가 기능을 제공합니다. - 데코레이터 디자인 패턴은 추가 책임이 있는 원본 클래스를 로드하지 않고 나누기 때문에 SOLID의 단일 책임 원칙을 따르는 데 가장 자주 사용됩니다. 데코레이터 클래스로 - 데코레이터는 구조적으로 책임 사슬 패턴(chain of Responsibility)과 거의 유사합니다. 다음 핵심 사항을 고려해야 합니다 . - 데코레이터는 런타임 중에 객체의 동작을 수정하는 데 유용합니다. 이 코드는 유지 관리 및 확장이 쉽습니다. - 이 패턴의 단점은 동일한 유형의 데코레이터 객체가 많이 사용된다는 것입니다. - 데코레이터 패턴은 Java IO 클래스(FileReader, BufferedReader 등)에서 자주 사용됩니다. 우리가 할 일 - 인터페이스 생성 - 콘크리트 생성 이 인터페이스의 구현 - 이 인터페이스를 구현하는 추상 데코레이터 만들기 - 추상 데코레이터에서 상속되는 구체적인 데코레이터를 만들어 보겠습니다. - 구체적인 데코레이터를 사용하여 인터페이스의 구체적인 구현을 "장식"합니다. 구현 : Shape 인터페이스와 구체적인 클래스를 만듭니다. 이 인터페이스를 구현하는 것입니다. 다음으로 Shape 인터페이스를 구현하고 Shape 개체를 클래스 필드로 갖는 추상 데코레이터 클래스인 ShapeDecorator를 만듭니다. 예제가 포함된 데코레이터 디자인 패턴 - 1 - 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를 위한 내 블로그
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION