简体   繁体   中英

How to remove decorated object from Decorator Pattern?

How could I remove items that have been added using the decorator design pattern? For example Pizza Ordering System. I want to be able delete some items and decrease price.

public interface Pizza {
    double getPrice();
}
public class SimplePizza implements Pizza {

    @Override
    public double getPrice() {
        return 25;
    }
}
public abstract class PizzaDecorator implements Pizza {
   Pizza tempPizza;
   public PizzaDecorator(Pizza a){
       tempPizza = a;
   }
   @Override
   public double getPrice(){
       return tempPizza.getPrice();
   }
}
public class Mushroom extends PizzaDecorator {
    public Mushroom(Pizza newPizza){
        super(newPizza);
    }
    public double getPrice(){
        return tempPizza.getPrice() + 10;
    }
}

One of the possible way to do like this:

 interface Pizza {
    double getPrice();
    public abstract Pizza removeItem();
}
 class SimplePizza implements Pizza {

    @Override
    public double getPrice() {
        return 25;
    }
    @Override
    public Pizza removeItem(){
     return null;
    }
}
 abstract class PizzaDecorator implements Pizza {
   Pizza tempPizza;
   public PizzaDecorator(Pizza a){
       tempPizza = a;
   }
   @Override
   public double getPrice(){
       return tempPizza.getPrice();
   }
   public abstract Pizza removeItem();
   }

    class Mushroom extends PizzaDecorator {
    public Mushroom(Pizza newPizza){
        super(newPizza);
    }
    public double getPrice(){
        return tempPizza.getPrice()+10;
    }
    @Override
    public Pizza removeItem(){
     return tempPizza;
    }

    }


     class Onion extends PizzaDecorator {
    public Onion(Pizza newPizza){
        super(newPizza);
    }
    public double getPrice(){
        return tempPizza.getPrice()+20;
    }

    @Override
    public Pizza removeItem(){
     return tempPizza;
    }
}

public class Main{


public static void main(String args[]){


        Pizza pizza = new SimplePizza(); 

        // create new FarmHouse pizza 
        Pizza pizza2 = new Mushroom(pizza); 


        System.out.println(pizza2.getPrice());//Prints 35.0
         pizza2 = new Onion(pizza2); 



         System.out.println(pizza2.getPrice());////Prints 55.0

       pizza2 = pizza2.removeItem();
         System.out.println(pizza2.getPrice());//Print 35.0



}


}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM