java 继承 模型_java – 画布形状模型的继承与组合?
對于以下模型,您更喜歡繼承還是組合:
>我想在畫布上繪制對象,每個對象代表一個數據對象
>將其視為狀態機圖:橢圓表示狀態,線表示它們之間的連接/轉換.對象表示本身永遠不會改變,即狀態將始終由橢圓顯示.但是繪制橢圓的方式應該不同,例如,對于選擇,它應該具有不同的顏色,而拖動它應該具有alpha通道等.
從設計的角度來看,橢圓不是狀態,而線不是過渡.無論如何,將兩個對象組合起來以便能夠在List< Shape>中收集它們是合適的.并在每個對象上執行shape.draw().
現在有2個設計模型是可能的,而我認為2個類總是相同的:
interface Shape {
void draw();
}
abstract class Figure implements Shape {
//basic vars like start and end coordinates
int x0, y0, x1, y1;
}
遺產:
abstract class State extends Figure {
String name;
}
class Rectangle extends State {
@Override void draw();
}
class Line extends Figure;
class Transition extends Line
雖然從設計的角度來看,矩形不是狀態,而狀態不是圖形,但是關于繪圖上下文,這可能是可行的.因為我可以繼承處理形狀,繪圖等所需的大部分東西.
或組成:
abstract class State {
String name;
}
class Rectangle extends Figure {
private State state;
@Override void draw();
}
class Line extends Figure {
private Transition transition;
@Override void draw();
}
所以Rectangle Line將是我的對象的包裝器.
Rectangle和Line應該擴展State和Transition,還是包含它?
或者,也許還有一個我沒有看到的第三個設計選項.期待您的想法.
最佳答案 所以,這是我的想法,但對于大多數設計問題,很少有一個“正確”的答案.
就像你說的,狀態不是矩形,轉換不是直線.我們可以畫一條線和/或一個矩形,并且可能有一些優勢來對待它們.所以我可以將這些語句翻譯成一個簡單的設計:
public interface Drawable
{
public void draw();
public Position getPos();
}
public class Rectangle implements Drawable ...
public class Line implements Drawable ...
現在,State’s和Transition’s可以用這些Drawables來表示.你聽說過單一責任原則嗎?它基本上就是它聽起來的樣子,一個Object應該負責做一件“事情”.矩形和直線知道如何繪制自己.狀態和轉換可能在您的系統中還有其他工作要做.
public interface Figure
{
public Drawable getDrawable();
}
public class State implements Figure
{
private Rectangle rect;
public Drawable getDrawable() { return rect; }
//... State's real "work" below
}
public class Transition implements Figure
{
private Line line;
// you get the idea
}
在一個小/簡單的系統上,SRP的優點可能會丟失,但我們的想法是我們將渲染與其他系統邏輯分開.我們分離的功能越多,變更時間到來時系統就越不易碎.
總結
以上是生活随笔為你收集整理的java 继承 模型_java – 画布形状模型的继承与组合?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 开源记账_生鲜配送系统ERP(
- 下一篇: java it_Java中的Iterat