【发布时间】:2013-01-17 03:01:18
【问题描述】:
我正在尝试使用装饰器模式“装饰” 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,除非我在我的 Decorator 基类中专门这样做:
- (BOOL)isSelected {
return self.decoratedCell.isSelected;
}
这对于一种方法来说很好,但必须覆盖UICollectionViewCell 中的每个方法似乎并不正确。我应该使用forwardInvocation: 吗?
我是否在滥用这种模式,还有其他选择吗?因为当您只需要覆盖诸如
之类的基本方法时,它在书籍中的效果非常好 getPrice() {
return decoratedObject.getPrice() + 1.10f;
}
.. 但似乎很难达到用自定义行为实际装饰现有 UI 元素的目的。
谢谢
编辑:我试图避免的是这样的课程:
- 发光的BorderedCell
- LabeledGlowingBorderedCell
- 等
在纸面上,装饰器是我想要实现的目标的完美候选者,但实现绝对让我难过。
【问题讨论】:
-
这是一个有趣的问题,我喜欢将其应用于 UI 项目的想法。从实现的角度来看,您质疑是否滥用该模式,实际上取决于可读性和可维护性。如果使用这种模式(即使重写了很多方法)使您的代码更具可读性和可维护性,那就去做吧。如果它掩盖了代码的意图和功能,并且让下一个人更难改变,那么不要
-
这是它的主要用途之一。
-
@Rob,我了解设计模式的目的,但在 Sam 的情况下,他必须做额外的、可能不太可维护的工作才能使解决方案正常工作。我试图给 Sam 一个基本的判断电话的基础
-
我不是在批评,我只是在说明 Decorator 最常用于他所询问的 ui 内容。
-
不得不委派所有方法看起来确实很麻烦,尽管您可以执行编译指示和一些代码折叠。这就是装饰器的工作原理。我想过这样的想法,我认为它们很好。所以你不能注册自己的课程?那个怎么样?这不是他们要求一个类实例化的全部意义吗?
标签: iphone ios design-patterns decorator uicollectionview