我正在为iOS制作绘图应用程序,并且有以下课程:CanvasViewController
保留一个CanvasView
,并允许您选择要在工程图中使用的Brush
CanvasView
是一个UIView
,其中包含背景色和Stroke
数组,这些数组通过连接touches
事件和drawRect
呈现Stroke
是包含NSObject
和UIBezierPath *path
的Brush
Brush
包含由int brushType
定义的typedef
,可以是BrushTypeSolid, BrushTypeSpray, BrushTypePattern
之类的东西
最初,我考虑过如何在brushType
中绘制不同的drawRect
,它类似于以下内容:
在drawrect
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsBeginImageContext(self.frame.size);
if ([squigglesArray count] > 0) {
for (WDSquiggle *squiggle in squigglesArray) {
[self drawSquiggle:squiggle inContext:context];
}
}
[self drawSquiggle:currentSquiggle inContext:context];
UIGraphicsEndImageContext();
在drawSquiggle中
switch (squiggle.brushType): {
case BrushTypeSolid:
//solid brush stuff
break;
case BrushTypeX:
//x stuff
break;
}
但是,现在所有绘制逻辑都以将
CanvasView
和BrushType
紧密联系在一起的方式处理。是否有一种优雅的方法将绘图逻辑封装在
BrushType
或Squiggle
中,以便我可以执行以下操作:[squiggle drawInRect:myRect]
要么
[squiggle drawInView:myView]
还是,这是一个愚蠢的目标/我不了解封装?
最佳答案
您可以将BrushType
变成带有每个特定实现子类的类,然后将drawSquiggle
中的相关逻辑移到该类中。 drawSquiggle
只需调用:
[squiggle.brushType draw......]
(您当然可以找到此方法的最佳名称和参数)
这是称为"replace conditional with polymorphism"的重构。