我有两个项目:A和B应该相互交互。
项目A介绍接口名称ISpecialTask和项目B应该实现它。
Projet B有一个名为TaskWithListOfProperties的实体,它不能实现ISpecialTask,因为它具有不同的属性结构(此外,所有系统都知道如何使用TaskWithListOfProperties并且我不想更改其结构)。
所以我决定创建一个名为SpecialTaskFromListOfProperties的类来实现ISpecialTask并使用TaskWithListOfProperties实例,以便将它用于项目之间的交互。
interface ISpecialTask {
long Id{get;}
long WorkerId{get;}
long VehicleId{get;}
long CustomerId{get;}
}
class TaskWithListOfProperties {
IDictionary<string, long> Properties {get;
}
class SpecialTaskFromListOfProperties : ISpecialTask {
public SpecialTaskFromListOfProperties(TaskWithListOfProperties ins) {
...
...
}
public long Id { get{ ... } }
public long WorkerId { get{ ... } }
public long VehicleId { get{ ... } }
public long CustomerId { get{ ... } }
}
SpecialTaskFromListOfProperties实际上是适配器模式吗?
适配器模式和装饰器模式之间有什么区别?
答案 0 :(得分:11)
从original GoF book开始,适配器模式的目的 [Black Wasp] [Wikipedia] 是......
将类的接口转换为客户期望的另一个接口。适配器允许类一起工作,否则由于不兼容的接口而无法使用。
虽然装饰器模式 [Black Wasp] [Wikipedia] 的意图是...
动态地将附加职责附加到对象。装饰器为子类化提供了灵活的替代方法,以扩展功能。
虽然模式类似,但从定义来看,很明显这是适配器模式。你有一个方形钉(TaskFromListOfProperties
)需要放入圆孔(ISpecialTask
),所以你已经使用SpecialTaskFromListOfProperties
进行了调整。
装饰器会增加/扩展TaskFromListOfProperties
的现有功能,即它不会改变其现有界面。这不是SpecialTaskFromListOfProperties
正在做的事情。
答案 1 :(得分:8)
取决于您实际想要实现的目标。 适配器和装饰器非常相似,但是当您实施适配器时,除了转换之外,您不会带来任何新逻辑。在实施装饰器时,您实际上会引入一些以前从未在您装饰的对象中存在过的全新功能。
因此,长话短说,如果界面属性Id
,WorkerId
等自然来自TaskWithListOfProperties
- 那么您应该将其视为适配器。否则它是装饰器。