2016-10-26 87 views
1

這有點難以解釋,所以我寫了一個例子來說明這個概念。在下面的例子中,我有一個庫存類,它模擬影響庫存模擬程序的數字。我還有一個MarketModifier類,它表示會以不同方式影響股票的事件。Java:將對象鏈接到另一個對象中的變量

public class ExampleArea 
{ 
    public static void main(String cvhfg[]) 
    { 
     Stock test = new Stock(1f,1f,1f,1f); 
     MarketModifier worldEvent = 
      new MarketModifier("Bad publicity",-2.5f,"publicOpinion"); 
    } 
} 
class MarketModifier 
{ 
    public MarketModifier(String name, float modifier, String variable) { 
     super(); 
     this.name = name; 
     Modifier = modifier; 
     this.variable = variable; 
    } 
    String name; 
    float Modifier; 
    String variable; 
} 
class Stock 
{ 
    public Stock(float value, float integrity, float publicPresence, float publicOpinion) { 
     super(); 
     this.value = value; 
     this.integrity = integrity; 
     this.publicPresence = publicPresence; 
     this.publicOpinion = publicOpinion; 
    } 
    float value; 
    float integrity; 
    float publicPresence; 
    float publicOpinion; 
    //...other variables... 
} 

我的問題是如何將我的marketModifer鏈接到該變量的股票模型(以上是「publicOpinion」中的「變量」字符串設定的例子),而不使用字符串。字符串有可能使它們濛濛的問題,我需要一個開關來識別修飾符影響哪個變量。

我想使用一個枚舉,但我仍然需要一個切換表來檢查它們,我也必須更新枚舉值每次股票有一個不同的變量,可能會受到影響(可能有額外的變量Stock的子類)。我想到的另一種選擇是反思,但這種解決方案雖然我認爲可行,但似乎過於複雜,並且增加了閱讀難度,而不是解決問題。

那麼,有沒有更好的方法將一個對象鏈接到它在另一個對象中影響的變量(可能是某種觀察者/觀察者模式?)。

+0

所以你想'變量'屬性是股票上修改後的財產的名稱? –

+0

我希望它在編譯時確認庫存中有該變量(該字符串不是編譯時間檢查)。在C++或C#中,我可以通過某種指向它影響的變量的指針來完成此操作。但是Java沒有指針,我怎麼會比上面的字符串實現更好? –

+0

我不明白你爲什麼不想使用枚舉。 –

回答

3

既然你想避免反射方法,我可以建議的是使用事件監聽器的方法。

因此,您基本上想要做的是在執行市場操作時監聽事件,然後修改您的Stock對象中的值。

所以你需要一個類似這樣的接口,你的MarketModifier在處理時會調用它。

Modifier.java

public interface Modifier {  
    public void modify(Stock taget, float modifier);  
} 

該接口的實現將能夠修改股票對象中的任何值(S)。

的實現應該是這樣的:

PublicOpinionModifier.java

public class PublicOpinionModifier implements Modifier { 

    public void modify(Stock target, float modifier) { 
     target.setPublicOpinion(target.getPublicOpinion() + modifier); 
    } 

} 

之後,你可以創建你MarketManager類是這樣的:

MarketManager.java

public class MarketManager { 

    // The name of the event. 
    private String name = "unkown"; 

    // Modifier value of the event. 
    private float modifier = 0f; 

    // The listener to listen for the modifications. 
    private Modifier modificationListener; 

    // The target stock object towards which the action is directed. 
    private Stock target; 

    /** 
    * Executes the market event. 
    */ 
    public void executeAction() { 
     modificationListener.modify(target, modifier); 
    } 

} 

MarketManager將有目標對象(Stock對象更新)和Modifer實現這將是作爲這將在市場上的東西是怎麼回事調用的聽衆......

TestMarket。 java

public class TestMarket { 

    public static void main(String[] args) { 
     Stock stock = new Stock(1f, 3f, 1f, 3f); 

     MarketManager manager = new MarketManager(); 
     manager.setTarget(stock); 
     manager.setName("Bad Publicity"); 
     manager.setModifier(-2f); 
     manager.setModificationListener(new PublicOpinionModifier()); 

     manager.executeAction(); 
    } 

} 

整潔!


我已上傳一個更清潔,在我public repo闡述的版本。

相關問題