我有一个 ActiveRecordBaseModel
类和许多继承自它的类模型。而且我有一个类Bookmark
,它也继承自BaseModel
。另外,我有Decorator
- 继承的类,它们实现了特殊的接口来表示单个模型(getModelView(model)
方法)。这是一些伪代码:
TestModel inherits BaseModel
getName:
return this.name
BookmarkModel inherits BaseModel
BaseModel model
getBookmark:
return this.model
TestDecorator inherits BaseDecorator implements SingleModelViewInterface:
getView(model):
return 'view' //html-view of model
BookmarkDecorator inherits BaseDecorator
getBookmarksView(BookmarkModel[] bookmarks):
foreach(bookmarks > bookmark):
decorator = Relation::getDecoratorByModel(bookmark->getEntityType())
decorator->getView(bookmark->getBookmark())
所以,一切看起来都很好,直到我想稍微改变一下书签模型的视图。我想为该视图添加一个自定义标题。而且我不能在装饰器中制作它,因为它不仅会为书签呈现它。
编辑:所以,问题是 - 似乎我需要一个装饰器模式,但我没有任何东西可以继承,因为具体的 TestDecorator 使用 TestModel 特殊方法。所以现在我使用魔术方法(PHP)做了一些非常糟糕的实现:
class BookmarkedModel {
/** @var BaseEntityModel*/
private $model;
public function __construct(BaseEntityModel $model) {
$this->model = $model;
}
public function getName() {
return 'Bookmark '.$this->model->getName();
}
public function __call($name, $arguments) {
return call_user_func_array(array($this->model, $name), $arguments);
}
public function __get($name) {
return $this->model->$name;
}
public function __set($name, $value) {
return $this->model->$name[$value];
}
}
所以它现在可以工作,但就代码结构、可读性和稳定性而言,这是一个非常糟糕的决定。