@lew
The Decorator pattern is a structural design pattern that allows you to dynamically add functionality to an object by wrapping it with a decorator object that adds additional behavior to it. In PHP, you can implement the Decorator pattern using classes and interfaces.
Here's an example of how to implement the Decorator pattern in PHP for dynamic functionality:
1 2 3 |
interface ComponentInterface { public function operation(): string; } |
1 2 3 4 5 |
class ConcreteComponent implements ComponentInterface { public function operation(): string { return "ConcreteComponent"; } } |
1 2 3 4 5 6 7 8 9 10 11 |
abstract class Decorator implements ComponentInterface { protected $component; public function __construct(ComponentInterface $component) { $this->component = $component; } public function operation(): string { return $this->component->operation(); } } |
1 2 3 4 5 |
class ConcreteDecorator extends Decorator { public function operation(): string { return "ConcreteDecorator(" . parent::operation() . ")"; } } |
1 2 3 |
$component = new ConcreteComponent(); $decorator = new ConcreteDecorator($component); echo $decorator->operation(); // Output: ConcreteDecorator(ConcreteComponent) |
In this example, the ConcreteComponent
class represents the base object that you want to add functionality to. The Decorator
abstract class represents the base decorator, which has a reference to the component and implements the interface. The ConcreteDecorator
class represents a concrete decorator that adds additional functionality to the component. Finally, you can use the decorators to add functionality to the component.
@lew
The Decorator design pattern allows you to dynamically add functionality to an object at runtime. In PHP, you can implement the Decorator pattern using interfaces and classes.
Here's an example implementation:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<?php // Define an interface for the base object interface ComponentInterface { public function operation(); } // Define a concrete implementation of the base object class ConcreteComponent implements ComponentInterface { public function operation() { return "ConcreteComponent"; } } // Define a decorator that adds additional functionality to the base object abstract class Decorator implements ComponentInterface { protected $component; public function __construct(ComponentInterface $component) { $this->component = $component; } public function operation() { return $this->component->operation(); } } // Define a concrete implementation of the decorator that adds uppercase functionality class UpperCaseDecorator extends Decorator { public function operation() { return strtoupper(parent::operation()); } } // Define a concrete implementation of the decorator that adds lowercase functionality class LowerCaseDecorator extends Decorator { public function operation() { return strtolower(parent::operation()); } } // Create a concrete component object $component = new ConcreteComponent(); // Create a decorator that adds uppercase functionality to the component object $decorator = new UpperCaseDecorator($component); // Use the decorated object echo $decorator->operation(); // Output: CONCRETECOMPONENT // Create another decorator that adds lowercase functionality to the decorated object $decorator2 = new LowerCaseDecorator($decorator); // Use the double-decorated object echo $decorator2->operation(); // Output: concretecomponent ?> |
In this example, we first define an interface ComponentInterface
for the base object and a concrete implementation ConcreteComponent
that implements this interface.
Next, we define an abstract Decorator
class that also implements the ComponentInterface
. This class has a protected variable $component
which is a reference to the decorated object. We then define two concrete implementations of the decorator UpperCaseDecorator
and LowerCaseDecorator
. These decorators add uppercase and lowercase functionality respectively.
We then create a concrete ConcreteComponent
object and pass it to an UpperCaseDecorator
object. This decorated object is then used to output the string in uppercase. We then pass this decorated object to a LowerCaseDecorator
object to further modify the string to lowercase before outputting it.
This is just a simple example, but the Decorator pattern can be used in much more complex scenarios to add dynamic functionality to objects at runtime.