Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 差异适配器和装饰器_Java_Design Patterns - Fatal编程技术网

Java 差异适配器和装饰器

Java 差异适配器和装饰器,java,design-patterns,Java,Design Patterns,我正在学习设计模式,现在我试图理解适配器和装饰器之间的区别。考虑以下列表中的装饰器: Collections.synchronizedList(List<T> lst) 难道没有人能解释这一区别吗?装饰者模式主要是为了承担/向类引入额外的责任。例如,您可以使用对象序列的类容器并实现迭代器,以赋予在类内迭代该集合的额外功能 戈夫 将其他职责动态附加到对象。 装饰器提供了一种灵活的替代子类化的方法来扩展 功能 另一方面,适配器将一个类转换为另一个职责,如您所示的示例中所示,适配器将水管

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

Collections.synchronizedList(List<T> lst)

难道没有人能解释这一区别吗?

装饰者模式主要是为了承担/向类引入额外的责任。例如,您可以使用对象序列的类容器并实现迭代器,以赋予在类内迭代该集合的额外功能

戈夫

将其他职责动态附加到对象。 装饰器提供了一种灵活的替代子类化的方法来扩展 功能

另一方面,适配器将一个类转换为另一个职责,如您所示的示例中所示,适配器将水管工转换为厨师

戈夫

将类的接口转换为另一个接口客户端 期待。Adapater让类一起工作,而这在其他情况下是不可能的 因为接口不兼容


装饰器使用附加功能“装饰”现有接口,但新实例的接口和类型保持不变-请注意synchronizedList如何获取列表并返回列表。适配器“调整”一个特定的界面,使其看起来完全不同,不相关的界面——在您的例子中,它将一个水管工变成一个主管,一个完全不同的类型

Decorator:您想向类添加功能,但不想使用继承(使用基类的实例),请参阅(开闭原则)


适配器:您有一个要使用的类,但这些方法与您程序中使用的方法不同,您创建了一个包含该类实例的类,并且您的程序必须直接与该类对话,请参见(liskov替换原则).

通过adpter模式,我们可以将未嵌入的对象绑定在一起,对吗?正确。您将一个类转换为另一种形式,否则将无法与interfaceThere的另一种适配器(称为“适配器的类形式”)进行操作,因此
ChiefAdapter实现了Chiefands Plumber
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();
    }

}