Инкапсулируйте способ рисования кисти определенного типа в Objective-C - PullRequest
1 голос
/ 02 апреля 2012

Я делаю приложение для рисования для iOS, и у меня есть следующие классы:

  • CanvasViewController содержит CanvasView и позволяет выбрать Brush для использования на чертеже
  • CanvasView - это UIView, который содержит цвет фона и массив Stroke, которые отображаются путем связывания touches событий и drawRect
  • Stroke - это NSObject, который содержит UIBezierPath *path и Brush
  • Brush содержит int brushType, который определяется typedef и может быть чем-то вроде BrushTypeSolid, BrushTypeSpray, BrushTypePattern

Изначально я думал о том, как я буду обрабатывать рисунок brushType в моем 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();

в розыгрыше

switch (squiggle.brushType): {
    case BrushTypeSolid:
         //solid brush stuff
         break;
    case BrushTypeX:
         //x stuff
         break;
}

Однако теперь логика рисования обрабатывается таким образом, что сильно связывает CanvasView и BrushType вместе.

Есть ли элегантный способ инкапсулировать логику рисования в BrushType или Squiggle, чтобы я мог сделать что-то вроде:

[squiggle drawInRect:myRect]

или

[squiggle drawInView:myView]

Или это глупая цель иметь / я не понимаю инкапсуляцию?

1 Ответ

1 голос
/ 02 апреля 2012

Вы можете превратить BrushType в класс с подклассами для каждой конкретной реализации и переместить в него связанную логику внутри drawSquiggle.drawSquiggle просто вызовет:

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

(вы наверняка найдете лучшее имя и параметры для этого метода)

Это рефакторинг под названием «заменить условный полиморфизм».

...