我有一个例子,请告诉我它是否是Decorator模式?
public abstract class ComputerComponent
{
String description ="Unknown Type";
public String getDescription()
{
return description;
}
public abstract double getCost();
}
public abstract class AccessoryDecorator
{
ComputerComponent comp;
public abstract String getDescription();
}
public class PIIIConcreteComp extends ComputerComponent
{
public PIIIConcreteComp()
{
description= "Pentium III";
}
public double getCost()
{
return 19950.00;
}
}
public class floppyConcreteDeco extends AccessoryDecorator
{
public floppyConcreteDeco(ComputerComponent comp)
{
this.comp=comp;
}
public String getDescription()
{
return comp.getDescription() +", floppy 1.44 mb";
}
public double getCost()
{
return 250+comp.getCost();
}
}
public class ComponentAssembly
{
public static void createComponent()
{
ComputerComponent comp = new PIIConcreteComp();
// create a PIII computer object
ComputerComponent deco1= new floppyConcreteDeco(comp);
// decorate it with a floppy
//ComputerComponent deco2= newCDRomConcreteDeco(deco1);
ComputerComponent deco2= new floppyConcreteDeco(deco1);
// decorate with a CDRom or with one more floppy
System.out.println( deco2.getdescription() + " " + deco2.getCost());
}
}
谢谢。
答案 0 :(得分:1)
你的观点很好,但你的代码甚至都不会编译,主要是因为ComputerComponent必须是AccessoryDecorator和PIIIConcreteComp必须实现的接口(顺便说一句,你的大括号非常混乱)。通常,AccessoryDecorator也会实现像getDescription(){return comp.getDescription()}这样的方法的“默认”实现。
答案 1 :(得分:1)
这确实是装饰设计模式,尽管有点混乱的例子。
答案 2 :(得分:1)
这是一个装饰模式,但正如Finbarr所说,它有点混乱:
floppyConcreteDeco
(应以大写字母开头命名)和/或AccessoryDecorator
应扩展ComputerComponent
。
原因是您要使用装饰器对象的方式与使用“普通”ComputerComponent
的方式相同,除非您有公共基类或公共接口,否则您无法真正做到这一点