Tôi có lớp ActiveRecord BaseModel
và rất nhiều lớp học-mô hình kế thừa từ đó. Và tôi đã có một lớp học Bookmark
, được thừa hưởng từ số BaseModel
. Ngoài ra, tôi đã có Decorator
lớp được thừa kế, chúng thực hiện giao diện đặc biệt để biểu diễn mô hình đơn lẻ (phương pháp getModelView(model)
). Đây là một số mã giả:Mẫu thích hợp cho lớp ActiveRecord
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())
Vì vậy, mọi thứ có vẻ tốt, cho đến khi tôi muốn thay đổi Chế độ xem cho mô hình được đánh dấu một chút. Tôi muốn thêm tiêu đề tùy chỉnh cho chế độ xem đó. Và tôi không thể làm cho nó bên trong trang trí, bởi vì nó làm cho nó không chỉ cho một dấu trang.
EDIT: Vì vậy, vấn đề là - có vẻ như tôi cần một mẫu trang trí, nhưng tôi không có bất cứ điều gì để kế thừa từ, bởi vì TestDecorator cụ thể bằng cách sử dụng phương pháp speical TestModel. Vì vậy, bây giờ tôi đã thực hiện một số thực hiện thực sự xấu, sử dụng phương pháp kỳ diệu (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];
}
}
Vì vậy, nó sẽ làm việc cho bây giờ, nhưng về mặt cấu trúc mã, dễ đọc và ổn định đó là quyết định thực sự tồi tệ.
2cents tôi: sửa đổi getBookmark() để trả lại mô hình với tiêu đề tùy chỉnh. Chế độ xem chỉ là trình kết xuất đồ họa, nó sẽ vẫn giữ nguyên. – lucasg
getBookmark trả về bất kỳ mô hình nào, được kế thừa từ BaseModel. BaseModel có phương thức trừu tượng 'getName()'. Tôi đã thực hiện một số loại một mẫu Decorator (nhưng nó không phải là trang trí thực tế, tôi không có một lớp kế thừa từ.) – UnstableFractal
Bây giờ tôi đang suy nghĩ về việc thêm 'setName()' vào 'BaseModel'. Và chỉ cần thiết lập nó trong phương thức 'BookmarkModel'' getBookmark' sau khi lấy nó từ cơ sở dữ liệu. Tôi nghĩ rằng đó là quyết định dễ dàng hơn. Tôi không nghĩ rằng tôi sẽ phải đối mặt với bất kỳ chức năng cần thiết nào khác. – UnstableFractal