2010-12-10 162 views
1

對於我的軟件工程面向對象設計類的良好架構,我們的任務是實現一個簡單的「畫圖」程序,可以繪製簡單的事情像橢圓,矩形,線條,自由形式的曲線和文本。用於繪製形狀

我真的想在這裏找到黃金,並且想出了一個非常乾淨優雅的架構,因爲我們需要支持諸如打印,保存和導出到圖像之類的東西,並且我希望能夠以最小的努力做到這一點。

到目前爲止,我擁有類三 「層次」:

  1. Shape類:EllipseRectangleLineTextboxFreeform,從我的自定義所有繼承Shape
  2. 風格類,每一類的其實現了GraphicsModifier,其允許該類改變對象對象
    • StrokeStyle描述了形狀的stro柯應繪製,用StrokePaint對象
    • FillStyle描述的填充,具有Paint對象
    • TextStyle基本上是AWT的字體類的包裝,允許字體大小,樣式,和麪容易變形。
  3. 繪圖類

現在,我堅持我的繪畫課應該如何實現。

我最初的想法是有東西像

class DrawingObject { 
    StrokeStyle stroke; 
    FillStyle fill; 
    TextStyle text; 
    Shape shape; 

    void draw(Graphics2D g) { 
     //???? 
    } 
} 

的問題是,如果shapeFreeform,我需要通過在曲線的每個點只stroke和循環應用,並分別繪製。如果shapeRectangle,LineEllipse,我只需要應用strokefill,並使用g.draw(Shape)。如果shapeTextbox,我需要應用這三個strokefilltext,並使用g.drawString()

它發生,我認爲這可能是應用策略模式的好地方,打開的shape子類:

if (shape instanceof Freeform) { 
    strategy = new FreeformDrawer(shape); 
} else if (shape instanceof Rectangle || ...) { 
    strategy = new NormalDrawer(shape); 
} else if (shape instanceof Textbox) { 
    strategy = new TextboxDrawer(shape); 
} 
strategy.draw(g); 

(我想我可以在課上使用的小反射魔法switch名字也一樣,但這是題外話)

但不知何故,這感覺有點髒。

你會如何解決這個問題?我是否在談論這個錯誤?策略是一個好主意嗎?

如果重要,我使用Java和Swing來實現這一點,但理論上它應該適用於任何OO語言/框架。


TL;博士:
考慮以不同的方式繪製了一堆的對象,而獲得不同的能力,適用於他們的風格,你將如何吸引他們,用良好的面向對象設計的?

回答

0

如果你打算繼承heirarchy,它太平。

你真的想要的東西,如:

Drawable 
+-Shape 
| +-Rectangle 
| +-etc. 
+-FreeForm 
+-etc. 

或者,留着平層次結構,並使用虛擬render()方法。渲染應該只返回一個位圖,然後你的平局方法是這樣的:

void draw(Shape s) { 
    graphics.Draw(s.render(), s.x, s.y); 
} 

然後,您可以覆蓋每個類的render,使矩形產生單色位圖,橢圓返回一個位圖在外部是透明的,但在中心橢圓形的純色,等等。

社區Wiki,以便如果任何人覺得他們有東西要添加,他們可以直接前進並添加它。

+0

那麼,我簡化了一下我的例子。這幾乎是我所擁有的層次結構,除了我的頂層是`Shape`,然後`Rectangle`,`Ellipse`,`Line`都從`RectangularShape`繼承,它擴展了`Shape`。 `Freeform`和`Textbox`直接延伸`Shape` – 2010-12-10 04:08:40

+0

此外,我想保留我的形狀只關注自己的屬性,而不是自己畫。如果我按你的建議做,我的形狀現在「知道」位圖,在語義上它們不應該。 – 2010-12-10 04:11:15

1

你是對的 - 它確實感覺有點髒:)

的原因是,如果你真正使用的策略模式你需要替換你現有的子類。所以不會再有Rectangle類,只會有一個Shape,其策略設置爲RectangleDrawer。那麼就不需要那些醜陋的ifs,因爲不需要映射任何東西。

在這種情況下,我不認爲策略會是你最好的選擇。當你需要動態改變行爲時,策略非常適用,一旦繪製了正方形,我就會在程序中猜測它永遠不會變成一個圓圈。