[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는 데코레이터 클래스의 추상 클래스이며, ConcreteDecoratorAConcreteDecoratorB 클래스는 실제 데코레이터 역할을 합니다.

이 예시에서는 ConcreteComponent 객체를 생성하고, ConcreteDecoratorAConcreteDecoratorB로 순차적으로 데코레이터를 적용한 후 결과를 출력합니다.

결론

데코레이터 디자인 패턴을 사용하면 객체의 기능을 확장하거나 변경할 수 있어 유연성을 제공합니다. 새로운 기능을 추가하거나 여러 객체에 걸쳐 기능을 추가하고자 할 때 유용한 디자인 패턴 중 하나입니다.