当前位置: 首页 > 知识库问答 >
问题:

在Java中向装饰器模式添加“唯一性”约束 [重复]

单于正业
2023-03-14

我正在尝试用装饰图案做一些比萨饼(请耐心等待):

假设我有以下内容:

interface Pizza {
  public String makePizza();
}
class PlainPizza implements Pizza {
  @Override
  public String makePizza() {
    return "Base Pizza";
  }
}

然后我有一个总装饰师:

abstract class PizzaDecorator implements Pizza {

  protected Pizza specialPizza;

  public PizzaDecorator(Pizza specialPizza) {
    this.specialPizza = specialPizza;
  }

  public String makePizza() {
    return specialPizza.makePizza();
  }
}

以及装饰器的两种实现:

class SausageDecorator extends PizzaDecorator {

  public SausageDecorator(Pizza specialPizza) {
    super(specialPizza);
  }

  public String makePizza() {
    return specialPizza.makePizza() + addSausage();
  }

  private String addSausage() {
    return " + sausage";
  }
}
class OliveDecorator extends PizzaDecorator {

  public OliveDecorator(Pizza specialPizza) {
    super(specialPizza);
  }

  public String makePizza() {
    return specialPizza.makePizza() + addOlives();
  }

  private String addOlives() {
    return " + olives";
  }
}

问题是我可以有重复的装饰者。

我如何改变这段代码的结构来添加一个“唯一性”约束——也就是说,每个装饰器最多只能出现一次?(我家披萨店不允许顾客拿双份香肠,抱歉!)

class PizzaMaker
    {
        public static void main (String[] args)
        {
            Pizza pizza = new SausageDecorator(new SausageDecorator(new OliveDecorator(new PlainPizza())));
            System.out.println(pizza.makePizza());
        }
    }

输出:基础披萨橄榄香肠香肠

共有1个答案

微生昌勋
2023-03-14

为了添加唯一约束,您可以定义一个接口,称为UniqueTop,如下所示:

public interface UniqueTopping {
   public String getTopping();
   public void addTopping();
}

并让您的装饰器类< code>PlainPizza类实现它。

在您的装饰器类中,有一个名为topping的私有变量并实现getTop()addTop()如下所示:

class SausageDecorator extends PizzaDecorator implements UniqueTopping {

  private String topping = "";

  public SausageDecorator(Pizza specialPizza) {
    super(specialPizza);
  }

  public String makePizza() {
    addTopping();
    return specialPizza.makePizza() + " " + getTopping();
  }

  @Override
  public String getTopping() {
    return topping;
  }

  @Override
  public void addTopping() {

     if ( !specialPizza.getTopping().equals(getTopping()) ) {
         topping = "sausage";
     }

  }

}

请参阅 addTopping() 仅在构造函数中传递的特殊Pizza具有不同的顶端时才添加。getTopping() 只返回 addTopping() 中添加的 top

此外,您的<code>PlainPizza</code>应实现<code>UniqueTopping</code>以返回空<code>topping,如下所示:

class PlainPizza implements Pizza, UniqueTopping {
  @Override
  public String makePizza() {
    return "Base Pizza";
  }

  @Override
  public String getTopping() {
    return "";
  }

  @Override
  public void addTopping() {

  }

}
 类似资料:
  • 问题内容: 我有一种情况,我只想在其他字段中有特定值的情况下才添加唯一约束(例如表为ID CategoryName名称值Value CategoryID) 约束将在ID,CategoryName和Name上,只有CategoryID为0 是否有可能? 问题答案:

  • 这是我的限制: 该查询证明约束实际上不起作用: 下面是输出: 为什么唯一性没有被强制执行?

  • 我有一张桌子,不知怎的,同一个人进了我的桌子两次。现在,主键只是一个自动编号,但还有两个字段存在,我想强制它们是唯一的。 例如,这些字段是: 我只想要一张带有唯一PersonNumber和Active=1的唱片 (因此这两个字段的组合必须是唯一的) SQL server中现有表的最佳方式是什么?我可以这样做,如果其他任何人使用与现有值相同的值进行插入,则插入失败,因此我不必在应用程序代码中担心这一

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Circle.java,ShapeDecorator.java,RedShapeDecorator.java,DecoratorPatternDemo.java装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图:动态地给一个对象添加

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图:动态地给一个对象添加