相关疑难解决方法(0)

何时使用装饰器模式?

我正在研究我的设计模式,我在编码中尚未认真使用的一种模式是装饰模式.

我理解这种模式,但我想知道的是现实世界中一些具体的例子,装饰者模式是最佳/最佳/优雅的解决方案.需要装饰器模式的特定情况非常方便.

谢谢.

design-patterns decorator

58
推荐指数
5
解决办法
3万
查看次数

47
推荐指数
4
解决办法
3万
查看次数

装饰设计模式与继承?

我已经阅读了维基百科的装饰设计模式,以及该网站的代码示例.

我认为传统继承遵循'is-a'模式,而decorator遵循'has-a'模式.装饰者的调用约定看起来像'皮肤'上的'皮肤'......超过'核心'.例如

I* anXYZ = new Z( new Y( new X( new A ) ) );
Run Code Online (Sandbox Code Playgroud)

如上面的代码示例链接所示.

但是仍然有一些我不明白的问题:

  1. wiki是什么意思'装饰模式可以用来在运行时扩展(装饰)某个对象的功能'?'new ...(new ...(new ...))'是一个运行时调用,但很好但是'AwithXYZ anXYZ;' 是编译时的继承而且不好?

  2. 从代码示例链接中我可以看到,两个实现中类定义数量几乎相同.我记得在其他一些设计模式书中,比如"Head first design patterns".他们使用starbuzz咖啡作为例子,并说传统的继承将导致"阶级爆炸",因为对于每种咖啡组合,你会想出一个类.

    但在这种情况下装饰者是不是一样的?如果一个装饰器类可以接受任何抽象类并进行装饰,那么我猜它确实可以防止爆炸,但是从代码示例中,你可以得到确切的类定义,不能少......

有人会解释吗?

c++ design-patterns

24
推荐指数
2
解决办法
7430
查看次数

如何从Java中的Decorator Pattern中删除装饰对象

我正在读"傻瓜设计模式".我阅读并练习了装饰模式.使用Decorator Pattern,我们可以用任何东西装饰一个对象.现在,我想在装饰之前删除装饰对象.我已经通过ArrayList解决了这个问题,但我仍觉得它不好.你能告诉我如何删除装饰物吗?什么是更好的方式?

这是我的方式:

Computer.java

public class Computer {

    public Computer() {
    }

    public String description() {
        return "computer";
    }

}
Run Code Online (Sandbox Code Playgroud)

ComponentDecorator.java

public abstract class ComponentDecorator extends Computer {
    @Override
    public abstract String description();
}
Run Code Online (Sandbox Code Playgroud)

CD.java

public class CD extends ComponentDecorator {
    private Computer computer;

    public CD() {
    }

    public CD(Computer computer) {
        this.computer = computer;
    }

    @Override
    public String description() {
        return computer.description() + " and a CD";
    }

}
Run Code Online (Sandbox Code Playgroud)

Disk.java

public class Disk extends ComponentDecorator {
    private Computer computer; …
Run Code Online (Sandbox Code Playgroud)

java design-patterns decorator

5
推荐指数
2
解决办法
4855
查看次数

标签 统计

design-patterns ×4

decorator ×3

c++ ×1

composite ×1

java ×1