装饰模式与调用超级方法相同吗?

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()?

Jes*_*sen 5

通过调用super方法,您需要为每种可能性创建一个新的子类.例如,如果您想要一台带显示器和鼠标的计算机怎么办?您可以创建一个继承的子类Monitor.现在说你想要一台没有显示器和鼠标的电脑.你还需要另一个子类,它继承了Computer.只有两个设备,您已经需要三个子类(Monitor,MouseMonitorAndMouse).如果您的计算机还可以配备打印机,扫描仪和一组扬声器,该怎么办?

使用装饰器模式,您可以使用新设备"装饰"计算机.就像你使用的那样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.它几乎是一个装饰模式,只有你退后一步.