我有三種重複代碼的方法。 前兩種方法幾乎完全重複。第三種情況與火災有所不同,應該提供更多信息。刪除特定示例中的代碼重複
我想刪除這個重複的代碼,並考慮使用內部類的模板方法模式。這是正確的方式還是有更好的解決方案?
private void drawWaterSupplies(Graphics g) {
double hScale = getWidth()/(double) groundMap.getWidth();
double vScale = getHeight()/(double) groundMap.getHeight();
int imageOffsetX = waterSupplyImage.getWidth()/2;
int imageOffsetY = waterSupplyImage.getHeight()/2;
for (Location l : groundMap.getWaterSupplyLocations()) {
int x = (int) (l.getX() * hScale);
int y = (int) (l.getY() * vScale);
g.drawImage(waterSupplyImage, x - imageOffsetX, y - imageOffsetY,
null);
}
}
private void drawEnergySupplies(Graphics g) {
double hScale = getWidth()/(double) groundMap.getWidth();
double vScale = getHeight()/(double) groundMap.getHeight();
int imageOffsetX = energySupplyImage.getWidth()/2;
int imageOffsetY = energySupplyImage.getHeight()/2;
for (Location l : groundMap.getEnergySupplyLocations()) {
int x = (int) (l.getX() * hScale);
int y = (int) (l.getY() * vScale);
g.drawImage(energySupplyImage, x - imageOffsetX, y - imageOffsetY,
null);
}
}
private void drawFires(Graphics g) {
double hScale = getWidth()/(double) groundMap.getWidth();
double vScale = getHeight()/(double) groundMap.getHeight();
int imageOffsetX = fireImage.getWidth()/2;
int imageOffsetY = fireImage.getHeight()/2;
for (Fire fire : groundMap.getFires()) {
Location l = fire.getLocation();
int x = (int) (l.getX() * hScale);
int y = (int) (l.getY() * vScale);
g.drawImage(fireImage, x - imageOffsetX, y - imageOffsetY, null);
// TODO: draw status bar showing state of fire below
}
}
看起來不錯。但是這不違反模型和表示的分離嗎? – kobo
@ kobo - 有趣的一點。爲了完全實現這種分離,我想你必須調查雙重發送/訪問者模式,例如Fire對象(比如說)和圖形目標在它們自己之間進行調解以達到他們需要實現的圖形 –
好吧,我試過了弄清楚這是如何工作的。 我會有一個訪問接口的方法:'訪問(Fire f)','訪問(WaterSupply w)',... 然後,對於繪圖,我將有一個'新的DrawingVisitor(Graphics g)',它實現訪客界面來繪製對象。 這是不是你在說什麼? – kobo