2016-10-26 2 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 переменной в модели Stock (в приведенном выше примере это «publicOpinion» установлен в «переменной» String) без использования строки. У строк есть проблема, возможно, их омрачение, и мне нужен переключатель, чтобы определить, какая переменная повлияла на модификатор.

Я думал об использовании перечисления, но мне все равно понадобилась таблица коммутаторов, чтобы проверить их, и мне также нужно будет обновлять значения перечисления каждый раз, когда у акции есть другая переменная, которая может быть затронута (могут быть дополнительные переменные в подклассы запаса). Другой вариант, о котором я думал, был отражением, но это решение, хотя я думаю, что это сработает, кажется слишком сложным и затрудняет чтение, чем оно решает.

Итак, есть ли лучший способ связать объект с переменными (-ами), которые он затрагивает в другом объекте (возможно, какой-то шаблон наблюдателя/наблюдателя?).

+0

Итак, вы хотите, чтобы свойство 'variable' было именем измененного свойства на складе ?? –

+0

Я хочу, чтобы время компиляции проверялось на наличие этой переменной на складе (строка не проверяется временем компиляции). В C++ или C# я мог бы выполнить это с каким-то указателем на переменную, на которую он влияет. Но у Java нет указателей, как бы я сделал это лучше, чем строковая реализация выше? –

+0

Я не понимаю, почему вы не хотите использовать перечисления. –

ответ

3

Поскольку вы хотите избежать рефлексивных подходов, я могу предложить использовать прослушиватель событий.

Так что вы в основном хотите послушать событие, когда действие на рынке выполняется, а затем изменить значения в вашем объекте Stock.

Таким образом, вам понадобится такой интерфейс, который ваш MarketModifier вызывается при его обработке.

Modifier.java

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

И реализация этого интерфейса сможет изменить любое значение (ы) в наличии объекта.

Реализация будет выглядеть следующим образом:

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.

Смежные вопросы