2012-06-25 40 views
2

我喜歡實現以下場景。 (例如)我可以使用哪種設計模式?

我有3類:

  1. 控制器
  2. 蘋果

public class Apple implements IBonus { 
    public String name; 
    public String weight; 
} 


public class Car implements IBonus{ 
    public String brand; 
    public String vmax; 
    public String power; 
} 

public class Controller { 
    public List<String> values; 

    public void doWork(IBonus bonusObject){ 
     if(bonusObject instanceOf Car){ 
      Car c = (Car)bonusObject; 
      values.add(c.brand); 
      values.add(c.vmax); 
      values.add(c.power); 
     } 
     if(bonusObject instanceOf Apple){ 
      Apple a = (Apple)bonusObject; 
      values.add(a.name); 
      values.add(a.weight); 
     } 
    } 
} 

現在,我有很多喜歡蘋果類的和汽車。而且在不久的將來,每個班級的一些變量也會被改變,增加或刪除。 這將意味着我總是必須調整控制器類中的代碼。

有誰知道一個合適的模式?

+0

Java?使用所有這些。 –

回答

7

你不需要任何模式。只是普通的舊多態:

public interface IBonus { 
    void fillStringList(List<String> values); 
} 
... 

public void doWork(IBonus bonusObject){ 
    bonusObject.fillStringList(values); 
} 
+1

我敢打賭,他們也有這個名字!模板方法,也許? –

+1

沒有。模板方法是一種方法,它通過實現公共部分來完成一些複雜的工作,並將特定部分委託給在子類中重寫的方法。請參閱http://en.wikipedia.org/wiki/Template_method_pattern。我只是稱之爲多態。 –

+0

因此,如果'doWork'通過爲子類特定細節實現公共部分和委託給'fillStringList'來完成一些複雜的工作? –

4

編輯:設計模式 「訪客」。

更改iBonus界面上添加一個方法:

void add(List<String> values); 

有控制器,而不是做

bonusObject.add(values); 

這樣你委派特定任務(添加對象,以「價值」)的具體實施。

基本上,每當你發現自己編寫上面的代碼(如果instanceof或switch()),你應該考慮將任務委託給抽象方法。

你可能要考慮「雙派遣」又名。 「訪客」

http://en.wikipedia.org/wiki/Visitor_pattern

維基百科的版本是非常通用,並打出了「訪客」的邏輯(添加到列表)到一個獨立的類。在下面的版本中,「Bonus」對象播放該部分,而使用雙重調度結構。

在這種情況下,您有兩個接口:一個用於獎勵對象,另一個用於控制器。獎金對象有一個名爲

void visit(Controller c); 

然後控制器將調用紅利對象由此方法:

bonusObjecv.visit(this); 

的「訪問者」的目的主要是爲了讓你改變每個其他的實施方式中無關。它是簡單的多態解決方案的更通用的版本。不使用List等通用類,而是使用Controller接口。這樣你可以明確控制器和訪問對象之間的交互。

2

你可以添加一個方法:

public List<String> getValues(); 

您IBonus界面,只是使用的doWork如下:

values.addAll(bonusObject.getValues()); 

每個IBonus類型隨後將需要實現如何創建列表。

相關問題