我正在尝试使用装饰器模式来“装饰” UICollectionViewCells。
例如,如果我有一个
BaseCell : UICollectionViewCell
我希望能够做这样的事情:
BaseCell *cell = [[BaseCell alloc] initWithFrame]
cell = [[GlowingCell alloc] initWithCell:cell];
cell = [[BorderedCell alloc] initWithCell:cell];
cell = [[LabelledCell alloc] initWithCell:cell];
// cell is now a glowing, bordered, labelled cell.
我认为装饰器模式非常适合这类事情,但我很难将它应用到集合视图中。
首先,在 UICollectionViewControllers 中你需要注册一个类,像这样:
[self.collectionView registerClass:cellClass forCellWithReuseIdentifier:cellIdentifier];
所以我没有机会制作自己的实例。
其次,我看不出装饰器如何用于装饰“非纯”对象,即我没有从头开始创建但具有自己的属性和行为的对象(例如 UICollectionViewCell)。由于在上面的示例中,cell
表示 LabelledCell 的新实例,并且如果 UICollectionView 对方法进行调用,例如 ,除非我在我的 Decorator 基类中专门执行此操作,否则isSelected
它将调用:aLabelledCellInstance.isSelected
- (BOOL)isSelected {
return self.decoratedCell.isSelected;
}
这对于一种方法来说很好,但是必须覆盖UICollectionViewCell
. 我应该使用forwardInvocation:
吗?
我是否在滥用这种模式,还有其他选择吗?因为当您只需要覆盖基本方法时,它在书籍中非常有效,例如
getPrice() {
return decoratedObject.getPrice() + 1.10f;
}
.. 但似乎很难达到用自定义行为实际装饰现有 UI 元素的目的。
谢谢
编辑:我试图避免的是有这样的课程:
- 发光边框单元格
- 标记发光有界细胞
- 等等
在纸面上,装饰器是我想要实现的目标的完美候选者,但实现绝对让我难过。