这有点难以解释,所以我写了一个例子来说明这个概念。在下面的示例中,我有一个股票类,它模拟影响股票模拟程序的数字。我还有一个 MarketModifier 类,它表示会以不同方式影响股票的事件。
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 链接到 Stock 模型中的变量(在上面的示例中,它是在“变量”字符串中设置的“publicOpinion”)。字符串存在可能会打错的问题,我需要一个开关来确定修饰符影响了哪个变量。
我想过使用枚举,但我仍然需要一个切换表来检查它们,而且每次股票有一个可能受到影响的不同变量时,我还必须更新枚举值( Stock 的子类)。我想到的另一个选择是反射(reflection),但这个解决方案虽然我认为可行,但似乎过于复杂,并且增加了阅读难度而不是解决问题。
那么,是否有更好的方法将一个对象链接到它在另一个对象中影响的变量(也许是某种观察者/观察者模式?)。
最佳答案
既然您想避免反射方法,我建议您使用事件监听器方法。
所以您基本上想要做的是在执行市场行为时监听事件,然后修改您的 Stock
对象中的值。
因此您需要一个这样的接口(interface),您的 MarketModifier
会在处理时调用它。
Modifier.java
public interface Modifier {
public void modify(Stock taget, float modifier);
}
并且此接口(interface)的实现将能够修改股票对象中的任何值。
一个实现看起来像这样:
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 中上传了一个更干净和详细的版本.
关于Java:将对象链接到另一个对象中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271116/