Ява для украшения пиццы - PullRequest
0 голосов
/ 26 апреля 2018

Мне нужно реализовать шаблон оформления пиццы (американский и неаполитанский) с 4 разными начинками (салями, суджук, лук, перец), который расширяет класс «TopingDecorator», и из них 3 будут добавлены в пиццу командой «Добавить пиццу». Однако код не добавляет его в ArrayList TopingDecorator Pizza. Это должно быть что-то вроде ниже (я пытаюсь добавить Салями и Суджук в пиццу AmericanPan (которая расширяет класс PlainPizza)):

AmericanPan a = new American();
Salami s = new Salami(a);
Soudjouk so = new Soudjouk(s);

Вот мой класс PlainPizza:

public class PlainPizza implements Pizza{

    private int cost;
    private String name;
    private int orderID;
    List<ToppingDecorator> topingsOfPizza;

    public PlainPizza(int orderID){
        this.orderID = orderID;
        topingsOfPizza = new ArrayList<ToppingDecorator>();
    }


    public void addPizza(PlainPizza p) {
        Pizza.allPizzas.add(p);

    }

    public List<ToppingDecorator> getTopingsOfPizza() {
        return topingsOfPizza;
    }

    @Override
    public int cost() {
        // TODO Auto-generated method stub
        return cost;
    }

    public int getOrderID() {
        return orderID;
    }

    public String getName() {
        return name;
    }


    @Override
    public void addTopping() {

    }

А вот мой класс AmericanPan:

public class AmericanPan extends PlainPizza{

    // Class Instances
    private final int cost = 5;
    private String name;

    // Constructor
    public AmericanPan(int orderID) {
        super(orderID);
        this.name = "AmericanPan";
    }

    // Get Cost
    @Override
    public int cost() {
        return cost;
    }

    // Get Name
    public String getName() {
        return name;
    }

Я пытаюсь добавить салями на американскую сковороду в классе салями:

public class Salami extends ToppingDecorator{

    private String name;
    ToppingDecorator t;

    public Salami(PlainPizza pizza) {
        super(pizza);
        this.name = "salami";
        this.addToping();
    }

    @Override
    public int cost() {
        return super.cost() + 3;
    }

    @Override
    public void addTopping() {
        t = new Salami(pizza);
        pizza.topingsOfPizza.add(t);

    }

И я пытаюсь добавить его с кодом ниже в моей функции в основном классе, который управляет всем процессом:

PlainPizza piz = new AmericanPan(orderID);

// Check The Toppings that Pizza contains
if(pizzatops.contains("soudjouk")){
    soudjok = true;
}if(pizzatops.contains("salami")){
    salami = true;
}if(pizzatops.contains("pepper")){
    pepper = true;
}if(pizzatops.contains("onion")){
    onion = true;
}
// Add Pizza according to Toppings
for(int g = 0;g<pizzatops.size();g++){
    if(pizzatops.get(g).equals("salami")){
        Salami s = new Salami(piz);
    }else if(pizzatops.get(g).equals("pepper")){
        Pepper p = new Pepper(piz);
    }else if(pizzatops.get(g).equals("soudjouk")){
        Soudjouk p = new Soudjouk(piz);
    }
    else if(pizzatops.get(g).equals("onion")){
        Onion o = new Onion(piz);
    }
}
Pizza.allPizzas.add(piz);

System.out.println("AmericanPan pizza added to order " + orderID);

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

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

Если вы хотите добавить несколько начинок в одну пиццу, тогда Decorator - неправильный шаблон.

Вот моя упрощенная реализация декоратора

interface Pizza {
  int cost();
}

public class PlainPizza implements Pizza {

  @Override
  public int cost() {
    return 10;
  }
}

public abstract class ToppingDecorator implements Pizza {
  private Pizza pizza;

  public ToppingDecorator(PlainPizza aPizza) {
    pizza = aPizza;
  }

  @Override
  public int cost() {
    return pizza.cost();
  }
}

public class SalamiPizza extends ToppingDecorator {
  public SalamiPizza(PlainPizza aPizza) {
    super(aPizza);
  }

  @Override
  public int cost() {
    return super.cost() +3;
  }
}

public static void main(String[] args) {
  SalamiPizza p = new SalamiPizza(new PlainPizza());
  System.out.print(p.cost());
}
0 голосов
/ 26 апреля 2018

Я думаю, ваша реализация неверна.Шаблон декоратора с использованием интерфейсов, абстрактных классов.

Здесь

Вы можете видеть, какова правильная реализация с Java.

...