[php] 데코레이터 디자인 패턴
데코레이터 디자인 패턴은 객체 지향 프로그래밍에서 유용하게 활용되는 디자인 패턴 중 하나입니다. 이 패턴은 기본 객체에 추가적인 기능을 동적으로 추가할 수 있는 유연한 방법을 제공합니다.
데코레이터 디자인 패턴의 역할
데코레이터 디자인 패턴은 클라이언트 코드에서 객체의 기능을 확장하거나 변경하지 않고, 새로운 기능을 추가할 수 있도록 합니다. 기존의 객체를 수정하지 않고 확장된 객체를 생성함으로써 기능을 추가하거나 수정합니다.
예시
<?php
interface Component {
public function operation(): string;
}
class ConcreteComponent implements Component {
public function operation(): string {
return "ConcreteComponent";
}
}
abstract class Decorator implements Component {
protected $component;
public function __construct(Component $component) {
$this->component = $component;
}
public function operation(): string {
return $this->component->operation();
}
}
class ConcreteDecoratorA extends Decorator {
public function operation(): string {
return "ConcreteDecoratorA(" . parent::operation() . ")";
}
}
class ConcreteDecoratorB extends Decorator {
public function operation(): string {
return "ConcreteDecoratorB(" . parent::operation() . ")";
}
}
$component = new ConcreteComponent();
$decorator1 = new ConcreteDecoratorA($component);
$decorator2 = new ConcreteDecoratorB($decorator1);
echo $decorator2->operation(); // Output: ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
?>
위의 예시는 PHP에서 데코레이터 패턴을 구현한 것입니다. Component
인터페이스는 작업을 정의하고, ConcreteComponent
클래스는 실제 작업을 수행합니다. Decorator
는 데코레이터 클래스의 추상 클래스이며, ConcreteDecoratorA
와 ConcreteDecoratorB
클래스는 실제 데코레이터 역할을 합니다.
이 예시에서는 ConcreteComponent
객체를 생성하고, ConcreteDecoratorA
와 ConcreteDecoratorB
로 순차적으로 데코레이터를 적용한 후 결과를 출력합니다.
결론
데코레이터 디자인 패턴을 사용하면 객체의 기능을 확장하거나 변경할 수 있어 유연성을 제공합니다. 새로운 기능을 추가하거나 여러 객체에 걸쳐 기능을 추가하고자 할 때 유용한 디자인 패턴 중 하나입니다.