對於我的軟件工程面向對象設計類的良好架構,我們的任務是實現一個簡單的「畫圖」程序,可以繪製簡單的事情像橢圓,矩形,線條,自由形式的曲線和文本。用於繪製形狀
我真的想在這裏找到黃金,並且想出了一個非常乾淨優雅的架構,因爲我們需要支持諸如打印,保存和導出到圖像之類的東西,並且我希望能夠以最小的努力做到這一點。
到目前爲止,我擁有類三 「層次」:
- Shape類:
Ellipse
,Rectangle
,Line
,Textbox
和Freeform
,從我的自定義所有繼承Shape
類 - 風格類,每一類的其實現了
GraphicsModifier
,其允許該類改變對象對象StrokeStyle
描述了形狀的stro柯應繪製,用Stroke
和Paint
對象FillStyle
描述的填充,具有Paint
對象TextStyle
基本上是AWT的字體類的包裝,允許字體大小,樣式,和麪容易變形。
- 繪圖類
現在,我堅持我的繪畫課應該如何實現。
我最初的想法是有東西像
class DrawingObject {
StrokeStyle stroke;
FillStyle fill;
TextStyle text;
Shape shape;
void draw(Graphics2D g) {
//????
}
}
的問題是,如果shape
是Freeform
,我需要通過在曲線的每個點只stroke
和循環應用,並分別繪製。如果shape
是Rectangle
,Line
或Ellipse
,我只需要應用stroke
和fill
,並使用g.draw(Shape)
。如果shape
是Textbox
,我需要應用這三個stroke
,fill
和text
,並使用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;博士:
考慮以不同的方式繪製了一堆的對象,而獲得不同的能力,適用於他們的風格,你將如何吸引他們,用良好的面向對象設計的?
那麼,我簡化了一下我的例子。這幾乎是我所擁有的層次結構,除了我的頂層是`Shape`,然後`Rectangle`,`Ellipse`,`Line`都從`RectangularShape`繼承,它擴展了`Shape`。 `Freeform`和`Textbox`直接延伸`Shape` – 2010-12-10 04:08:40
此外,我想保留我的形狀只關注自己的屬性,而不是自己畫。如果我按你的建議做,我的形狀現在「知道」位圖,在語義上它們不應該。 – 2010-12-10 04:11:15