2016-10-26 86 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阐述的版本。

相关问题