나는 프로그래밍 기사를 읽고 있었고 Decorator 패턴을 언급했다. 나는 잠시 동안 프로그래밍을 해왔지만 공식적인 교육이나 훈련이 없었지만 표준 패턴에 대해 배우려고합니다.
그래서 Decorator를 찾아서 Wikipedia 기사 를 찾았 습니다. 나는 지금 Decorator 패턴의 개념을 이해하고 있지만,이 구절에 약간 혼란 스러웠다.
예를 들어, 윈도우 시스템의 윈도우를 고려하십시오. 창의 내용을 스크롤하기 위해 가로 또는 세로 스크롤 막대를 적절하게 추가 할 수 있습니다. 윈도우가 Window 클래스의 인스턴스로 표시되고이 클래스에 스크롤 막대를 추가 할 수있는 기능이 없다고 가정합니다. 이를 제공하는 서브 클래스 ScrollingWindow를 만들거나 기존 Window 객체에이 기능을 추가하는 ScrollingWindowDecorator를 만들 수 있습니다. 이 시점에서 어느 쪽의 솔루션이든 괜찮을 것입니다.
이제 창에 테두리를 추가하는 기능을 원한다고 가정 해 봅시다. 다시, 우리의 원래 Window 클래스는 지원하지 않습니다. ScrollingWindow 서브 클래스는 이제 새로운 종류의 창을 효과적으로 만들었 기 때문에 문제를 일으 킵니다. 모든 창에 테두리 지원을 추가하려면 하위 클래스 WindowWithBorder 및 ScrollingWindowWithBorder를 만들어야합니다. 분명히,이 문제는 모든 새로운 기능이 추가 될수록 악화됩니다. 데코레이터 솔루션의 경우 새로운 BorderedWindowDecorator를 만들면됩니다. 런타임에 ScrollingWindowDecorator 또는 BorderedWindowDecorator 또는 둘 다를 사용하여 기존 창을 장식 할 수 있습니다.
모든 창에 테두리를 추가 할 때 옵션을 허용하기 위해 기능을 원래 Window 클래스에 추가하는 것이 어떻습니까? 내가 보는 방식으로, 서브 클래 싱은 클래스에 특정 기능을 추가하거나 클래스 메소드를 재정의하기위한 것입니다. 기존의 모든 객체에 기능을 추가해야한다면 왜 슈퍼 클래스를 수정하지 않겠습니까?
이 기사에는 다른 줄이 있습니다.
데코레이터 패턴은 서브 클래 싱의 대안입니다. 서브 클래 싱은 컴파일 타임에 동작을 추가하고 변경 사항은 원래 클래스의 모든 인스턴스에 영향을줍니다. 장식은 개별 객체에 대해 런타임에 새로운 동작을 제공 할 수 있습니다.
"... 변경은 원본 클래스의 모든 인스턴스에 영향을 미칩니다"라고 말하는 곳을 얻지 못합니다. 서브 클래 싱은 어떻게 부모 클래스를 변경합니까? 이것이 서브 클래 싱의 요점이 아닌가?
많은 Wiki와 마찬가지로 기사가 명확하게 작성되지 않았다고 가정합니다. 마지막 줄에서 데코레이터의 유용성을 볼 수 있습니다. "... 개별 개체에 대해 런타임시 새로운 동작을 제공합니다."
이 패턴에 대해 읽지 않고 개별 객체에 대해 런타임에 동작을 변경해야하는 경우 해당 동작을 활성화 / 비활성화하기 위해 수퍼 클래스 또는 서브 클래스에 일부 메소드를 빌드했을 것입니다. 데코레이터의 유용성을 정말로 이해하도록 도와주십시오. 왜 초보자 생각에 결함이 있습니까?