差异适配器和装饰器

时间:2015-07-09 08:56:46

标签: java design-patterns

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

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();
    }

}

有人解释不同之处吗?

3 个答案:

答案 0 :(得分:1)

装饰者模式主要用于为课程带来额外的责任。例如,您可以获取一个对象序列的类容器,并实现一个迭代器,以便在类中迭代该集合。

GOF

  

动态地将附加职责附加到对象。   装饰器为子类化提供了灵活的替代扩展   功能。

另一方面,Adapter将类转换为另一个责任,如您所示的示例,适配器将管道工转换为厨师。

GOF

  

将类的接口转换为另一个接口客户端   期望。 Adapater允许类一起工作,否则就不能   因为接口不兼容。

答案 1 :(得分:1)

装饰器'装饰'具有附加功能的现有接口,但新实例的接口和类型保持不变 - 请注意synchronizedList如何获取List并返回List。适配器“适应”一个特定的界面,看起来是一个完全不同的,无关的界面 - 在你的情况下,它将一个水管工变成了一个完全不同类型的酋长。

答案 2 :(得分:0)

装饰器:你想为类添加功能但你不想使用继承(使用基类的实例),参见(open closed principle)

适配器:你有一个你想要用户的类,但是这些方法与你在程序中使用的方法不同,你创建一个包含这个类的实例的类,你的程序必须直接与这个类对话,见(利斯科夫替代原则)。