【问题标题】:How to remove decorated object from Decorator Pattern?如何从装饰器模式中删除装饰对象?
【发布时间】:2019-04-20 17:45:29
【问题描述】:

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

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

【问题讨论】:

  • 使用 NoMushroomDecorator,比萨的价格减去 10?
  • @JBNizet 我有 20 件物品要装饰,我应该为所有物品都这样做吗?
  • 我认为要删除装饰器,您应该遍历(循环)装饰器列表,并构建一个新的比萨饼,省略您要删除的项目..
  • 你应该为你想要达到的目标做需要做的事情。如果你想允许移除蘑菇,你可以添加一个 NoMushroomDecorator。如果没有,你不会。我个人不会使用装饰器模式来表示披萨上的配料。我会简单地使用 Set,您可以在其中添加或删除浇头。
  • @JBNizet 我与设计模式有关这是我的功课:)

标签: java design-patterns decorator


【解决方案1】:

这样做的一种可能方法:

 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



}


}

【讨论】:

  • 但是这个方法总是删除最近的项目。我想删除任何项目..
  • 是的,这个解决方案有这样的限制。
猜你喜欢
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多