我可以重用装饰器吗?
我有一个 ClientDecorator
来装饰一个引用了客户端的实体,这个装饰器在调用 getClient 时获取数据库中的客户端(在它被装饰之前,这个方法返回clientId,修饰后返回Client实例。
好的,但是,我有一些其他的实体可以用相同的装饰器装饰,例如,我有另一个名为 questions
的表,这个表有一个指向客户端的引用问了一个问题,我有另一个名为 schedules
的表,其中有一个客户的引用。
顺便说一句,我可以用ClientDecorator
装饰question
和schedule
。
但是,我也有一个 QuestionDecorator
;这个人装饰了一个Answer
,等等
我如何做这个抽象,以便我可以随时重用装饰器?
我已经尝试创建 ClientDecorable
、QuestionDecorable
接口(interface),但没有取得任何进展。
最佳答案
您始终可以实例化装饰器类,将参数传递给构造器,构造器将告诉它应该如何表现或应该模拟哪个类。您实际上不必将装饰器声明为另一个类的扩展。
PHP 类支持 magic methods这使得将调用转发到您的对象正在模拟的类成为可能,就好像它正在使用 extends
扩展它一样。
例如:
class Client
{
public function getId() { return 123; }
}
class Decorator
{
private $instance = null;
public function __construct($class)
{
$this->instance = new $class();
}
public function __call($method, $params) // magic method
{
return call_user_func_array(array($this->instance, $method), $params);
}
}
$object = Decorator('Client');
echo $object->getId(); // 123
当您尝试访问不属于类 Decorator
的方法时,将调用魔法方法 __call()
。通过使用魔术方法 __get()
和 __set()
可以对属性完成相同的操作。
关于php - 我可以重用装饰器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19884049/