Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > наиболее гибкое задание параметров


Автор: Che0 1.11.2010, 22:57
Пишу программу отображающую работу автомата с напитками. 
сначала задаю набор доступных напитков,и их марки(чай:Липтон,кофе:Neckafe,сахар:Свекольный и тд.) 
Код
Machine m1=new Machine("coffee:COFFEE1","tea:TEA3","sugar:SUGAR2");
 
 тип напитка это отдельный енам, а марка -это  его параметр соответственно
на основе этого уже хочу  как бы делать заказ, Создовая обьект(напиток) с параметрами(сливки, сахар и тд.)
Код

Drink tea1=new Tea("no sugar",m1);


туплю вот над чем: как мне сделать что бы в Machine можно было гибко задавать параметры .т.е что бы можно было задать только кофе и сахар, Или же и кофе и сахар и чай и пиво и все это в любой последовательности. Как бы создавать разные автоматы по функционалу.

Автор: aleksandy 2.11.2010, 14:22
Все параметры реализуют один интерфейс. А конструкторы принимают на вход массив объектов этого типа. Вместо явного указания массива можно использовать переменное количество аргументов. Как-то так...

Автор: Che0 2.11.2010, 15:30
Цитата(aleksandy @ 2.11.2010,  14:22)
Все параметры реализуют один интерфейс. А конструкторы принимают на вход массив объектов этого типа. Вместо явного указания массива можно использовать переменное количество аргументов. Как-то так...

с интерфейсами я пока не умею работать,но если я правильно понял то так не пойдет, так как в этом случае при изменнении порядка(количесство)набора доступных напитков в Machine , мне придется в каждом классе напитка изменять индекс массива для нужного енама:
если например так
Код

Machine m1=new Machine("tea:TEA3","sugar:SUGAR2");

то индекс 0
Код

public class Tea extends HotDrink  {
        
    public double calcPrice(){
        
        // работа с machine.massiv[0];
        
    }
        
}

а если так
Код

Machine m1=new Machine("coffee:COFFEE1","tea:TEA3","sugar:SUGAR2");

то индекс надо менять на 1
Код

public class Tea extends HotDrink  {
        
    public double calcPrice(){
        
        // работа с machine.massiv[1];
        
    }

а надо что б всегда обращатся, к чему то одному, чтоб не переделывать весь код, при изменнени задачи набора доступных напитков

Автор: Astoret 2.11.2010, 17:20
Я бы сделал примерно так, если я тебя правильно понял:
Код

package ru.vingrad.forum.evilmachine;

import java.util.HashSet;
import java.util.Set;

public class HotDrink  {

    private double myPrice;
    private double additionPrice;
    private Set<Addition> listOfValidAddition = new HashSet<Addition>();
    private String name;
    
    public HotDrink(String name) {
        this.name = name;
    }
    
    public HotDrink(String name, double myPrice) {
        this.name = name;
        this.myPrice = myPrice;
    }
    
    public String getName() {
        return name;
    }
    
    public void setMyPrice(double myPrice) {
        this.myPrice = myPrice;
    }
    public String getMyPrice() {
        return name;
    }
    
    public double getFullPrice() {
        return myPrice + additionPrice;
    }
    public void addAdditionPrice(Addition addition) {
        if(validateAddition(addition)) {
            additionPrice += addition.getPrice();
        } else {
            System.out.println("Invalid addition!!!");
        }
    }
    
    public void addValidAddition(Addition addition) {
        listOfValidAddition.add(addition);
    }
    
    private boolean validateAddition(Addition addition) {
        return listOfValidAddition.contains(addition);
    }
}



Код

package ru.vingrad.forum.evilmachine;

public class Addition {
    
    private double price;
    private String name;

    public Addition(String name) {
        super();
        this.name = name;
    }

    public Addition(String name, double price) {
        super();
        this.price = price;
        this.name = name;
    }

    public double getPrice() {
     return price;
    }

    public void setPrice(double price) {
     this.price = price;
    }

    public String getName() {
     return name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Addition other = (Addition) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    
    
}

Ну класс машины с настройкой валидации напитков еще прикрутить можно, но мне лень уже
Код

package ru.vingrad.forum.evilmachine;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Addition sugar = new Addition("sugar:SUGAR2", 22.2);
        Addition lime = new Addition("lime:Lime1", 13.4);
        Addition milk = new Addition("milk:MILK1", 40.4);

        //Tea setup
        HotDrink tea = new HotDrink("tea:TEA3", 80.1);
        tea.addValidAddition(sugar);
        tea.addValidAddition(lime);
        tea.addValidAddition(milk);
        
        //Coffee setup
        HotDrink coffee = new HotDrink("coffee:COFFEE1", 99.9);
        coffee.addValidAddition(sugar);
        coffee.addValidAddition(milk);
        
        
        // Simulating the process of buying
        
        //Select coffee
        // add sugar
        coffee.addAdditionPrice(sugar);
        // add invalid addition
        coffee.addAdditionPrice(lime);
        
        // Get price
        System.out.println("Full Price = " + coffee.getFullPrice());
        
    }

}

Автор: _Y_ 2.11.2010, 18:14
Цитата(Che0 @  2.11.2010,  15:30 Найти цитируемый пост)
так как в этом случае при изменнении порядка(количесство)набора доступных напитков в Machine , мне придется в каждом классе напитка изменять индекс массива для нужного енама:


А если в качестве входных данных использовать коллекцию? Или уже внутри конструктора складывать все это в отсортированную коллекцию? Тогда последовательность каждый раз будет одной и той же.

Или такой вариант: По умолчанию создавать TreeMap с ключами, соответствующими полному списку доступных удовольствий (сахар, лимон, и.т.п). Потом загонять входные параметры в TreeMap:

Содержние TreeMap после создания (ключ - значение):
Код

coffe:NULL
tea:NULL
sugar:NULL
lime:NULL
milk:NULL
bear:NULL


Предположим, входные параметры содержат значения ("coffee:COFFEE1","sugar:SUGAR2", "lime:green") в любой последовательности. Грузим их в тот же TreeMap:
Код

coffe:COFFEE1
tea:NULL
sugar:SUGAR2
lime:green
milk:NULL
bear:NULL


При обработке TreeMap пропускаем шаги содержащие NULL. 




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)