我正在为iOS制作绘图应用程序,并且有以下课程:


CanvasViewController保留一个CanvasView,并允许您选择要在工程图中使用的Brush
CanvasView是一个UIView,其中包含背景色和Stroke数组,这些数组通过连接touches事件和drawRect呈现
Stroke是包含NSObjectUIBezierPath *pathBrush
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;
}


但是,现在所有绘制逻辑都以将CanvasViewBrushType紧密联系在一起的方式处理。

是否有一种优雅的方法将绘图逻辑封装在BrushTypeSquiggle中,以便我可以执行以下操作:

[squiggle drawInRect:myRect]

要么

[squiggle drawInView:myView]

还是,这是一个愚蠢的目标/我不了解封装?

最佳答案

您可以将BrushType变成带有每个特定实现子类的类,然后将drawSquiggle中的相关逻辑移到该类中。 drawSquiggle只需调用:

[squiggle.brushType draw......]


(您当然可以找到此方法的最佳名称和参数)

这是称为"replace conditional with polymorphism"的重构。

07-26 06:57