use*_*258 2 java design-patterns
这是装饰模式的一个例子.
public class Computer {
public String Description(){
return "Computer";
}
}
public abstract class Decorator extends Computer{
public abstract String description();
}
public class Monitor extends Decorator{
Computer computer;
public Monitor(Computer c){
computer = c;
}
public String description() {
return computer.Description() + " and Monitor";
}
}
public class main {
public static void main(String args[]){
Computer c = new Computer();
Monitor m = new Monitor(c);
System.out.println(m.description());
}
}
Run Code Online (Sandbox Code Playgroud)
调用超类的超级方法是否相同?比如当监视器从计算机继承然后调用监视器类中的Description方法内的计算机类中的super.Description()?
通过调用super方法,您需要为每种可能性创建一个新的子类.例如,如果您想要一台带显示器和鼠标的计算机怎么办?您可以创建一个继承的子类Monitor.现在说你想要一台没有显示器和鼠标的电脑.你还需要另一个子类,它继承了Computer.只有两个设备,您已经需要三个子类(Monitor,Mouse和MonitorAndMouse).如果您的计算机还可以配备打印机,扫描仪和一组扬声器,该怎么办?
使用装饰器模式,您可以使用新设备"装饰"计算机.就像你使用的那样Monitor,你可以为每个设备制作不同的装饰器.要创建包含所有设备的计算机,您现在可以执行类似的操作
Computer = new Speakers(
new Scanner(
new Printer(
new Mouse(
new Monitor(
new Computer()
)
)
)
)
);
computer.description();
Run Code Online (Sandbox Code Playgroud)
现在description()回来了Computer and Monitor and Mouse and Printer and Scanner and Speakers.您可以将设备与计算机混合搭配,而无需为每个组合创建新的子类.
评论:
在我的例子中,我删除了装饰器类然后监视器没有继承自计算机类,而是我只是将计算机类的实例放在监视器类中,然后执行相同的操作.
这样,您只能进入一级深度,只能将一台设备添加到计算机中.从本质上讲,它是一个不可扩展的装饰器.装饰器模式是一种有利于组合而不是继承的方式,因为在添加多个设备时可以获得巨大的增长.使用您的解决方案,您不依赖于继承,而是通过不创建子类,Computer而是Monitor使用a 组成Computer.它几乎是一个装饰模式,只有你退后一步.