java - 如何从装饰器模式中删除装饰对象?

标签 java design-patterns decorator

如何删除使用装饰器设计模式添加的项目?例如披萨订购系统。我希望能够删除一些商品并降低价格。

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;
    }
}

最佳答案

这样做的可能方法之一:

 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



}


}

关于java - 如何从装饰器模式中删除装饰对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55776160/

相关文章:

java - 当变量仅通过 setter 获得一次时,如何使变量的行为最终化

java - Java 中的正则表达式——只返回最后一个匹配项

java - 如何清除面板?

Ruby:当类方法就足够时,为什么要实例化一个对象并使用实例方法?

java - 组装分散数据的设计模式?

c# - 装饰器设计模式 : What is meant by adding functionality?

java - 将一个实体持久化到另一个实体之后 ~ Netbeans、J2E、bean、EntityManager

java - Play Framework : Causing a 'IllegalArgumentException occured

python - 将惰性求值转换为装饰器 (Python)

python - 在 python 抓取器中使用装饰器时遇到问题