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