差异适配器和装饰器

Difference adapter and decorator

我正在学习设计模式,现在我正在尝试了解适配器和装饰器之间的区别。考虑列表中的以下装饰器:

Collections.synchronizedList(List<T> lst)

在指定的 List 上创建同步装饰器。反过来,适配器模式也将它封装起来,如 here 所述。示例:

public interface Chief {

    public Object makeBreakfast();
    public Object makeDinner();
    public Object makeSupper();

}

public class Plumber {

    public Object getPipe(){
        return new Object();
    }

    public Object getKey(){
        return new Object();
    }

    public Object getScrewDriver(){
        return new Object();
    }

}

public class ChiefAdapter implements Chief{

    private Plumber plumber = new Plumber();

    @Override
    public Object makeBreakfast() {
        return plumber.getKey();
    }

    @Override
    public Object makeDinner() {
        return plumber.getScrewDriver();
    }

    @Override
    public Object makeSupper() {
        return plumber.getPipe();
    }

}

没有人解释一下区别吗?

装饰器模式主要是为了 taking/introducing 对 class 附加责任。例如,您可以使用一个包含对象序列的 class 容器并实现一个迭代器来赋予额外的职责,能够在 class 中迭代该集合。

高夫

attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

另一方面,Adapter 将 class 转换为另一个职责,如您展示的示例所示,adapter 将水管工转换为厨师。

高夫

convert the interface of a class into another interface clients expect. Adapater lets classes work together that couldn't otherwise because of incompatible interfaces.

装饰器 'decorates' 具有附加功能的现有接口,但新实例的接口和类型保持不变 - 请注意 synchronizedList 如何采用 List 和 returns List。 Adapter 'adapts' 一个特定的接口,显示为一个完全不同的、不相关的接口——在你的例子中,它把一个管道工变成了一个完全不同的类型的主管。

Decorator : 你想给一个class添加功能但是你不想使用继承(使用base的实例class),见(开闭原则)

适配器:您有一个要使用的 class,但这些方法与您程序中使用的方法不同,您创建了一个 class,其中包含此 [=14] 的一个实例=] 并且您的程序确实必须直接与此 class 对话,请参阅(liskov 替换原则)。