我正在学习设计模式,现在我试图了解适配器和装饰器之间的区别。请考虑列表中的以下装饰器:
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();
}
}
有人解释不同之处吗?
答案 0 :(得分:1)
装饰者模式主要用于为课程带来额外的责任。例如,您可以获取一个对象序列的类容器,并实现一个迭代器,以便在类中迭代该集合。
GOF
动态地将附加职责附加到对象。 装饰器为子类化提供了灵活的替代扩展 功能。
另一方面,Adapter将类转换为另一个责任,如您所示的示例,适配器将管道工转换为厨师。
GOF
将类的接口转换为另一个接口客户端 期望。 Adapater允许类一起工作,否则就不能 因为接口不兼容。
答案 1 :(得分:1)
装饰器'装饰'具有附加功能的现有接口,但新实例的接口和类型保持不变 - 请注意synchronizedList如何获取List并返回List。适配器“适应”一个特定的界面,看起来是一个完全不同的,无关的界面 - 在你的情况下,它将一个水管工变成了一个完全不同类型的酋长。
答案 2 :(得分:0)
装饰器:你想为类添加功能但你不想使用继承(使用基类的实例),参见(open closed principle)
适配器:你有一个你想要用户的类,但是这些方法与你在程序中使用的方法不同,你创建一个包含这个类的实例的类,你的程序必须直接与这个类对话,见(利斯科夫替代原则)。