Java:将对象链接到另一个对象中的变量

标签 java design-patterns enums

这有点难以解释,所以我写了一个例子来说明这个概念。在下面的示例中,我有一个股票类,它模拟影响股票模拟程序的数字。我还有一个 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/

相关文章:

java - 多个 OnClick 事件不适用于所有对象

c# - 需要一个带有用户反馈的 ASP.NET MVC 长时间运行的进程

c - 如何创建类型安全的枚举?

typescript - 为什么 TS 不使用 Symbols 作为枚举

java - 覆盖 JAX-WS WSDL 中的端点地址抛出 InaccessibleWSDLException

java - 使用 Java 应用程序连接应用程序服务器并检索数据的最佳方式

unit-testing - 编写通常只公开一个公共(public)方法的类是一种好习惯吗?

design-patterns - 掌握创建者与依赖注入(inject)

enums - 连接 Ada 枚举和 C 枚举

java - OSGI HttpService 无法正确初始化/注入(inject)