我正在尝试使用装饰者模式来“装饰”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调用方法,例如isSelected
,这将调用aLabelledCellInstance.isSelected
,除非我在我的装饰器基类中明确这样做:
- (BOOL)isSelected {
return self.decoratedCell.isSelected;
}
虽然只需要重写一个方法,但在UICollectionViewCell
中每个方法都这样做似乎不太合适。我应该使用forwardInvocation:
吗?
我是否滥用了这种模式,还有其他的替代方案吗?因为当你只需要重写基本方法如下面所示时,这种方式非常好用。
getPrice() {
return decoratedObject.getPrice() + 1.10f;
}
...但似乎很难适用于实际上使用自定义行为装饰现有UI元素的目的。
谢谢
编辑:我试图避免出现以下类:
- GlowingBorderedCell
- LabelledGlowingBorderedCell
- 等等。
在理论上,装饰器是我尝试实现的完美候选人,但实现绝对让我困惑不解。