这叫适配器吗?+适配器vs装饰器
本文关键字:适配器 vs | 更新日期: 2023-09-27 18:05:14
我有两个项目:A和B,应该相互作用。
-
项目A引入接口名称ispecaltask,项目B执行。
-
project B有一个名为TaskWithListOfProperties的实体,它不能实现isspecialtask,因为它具有不同的属性结构(此外,所有系统都知道如何使用TaskWithListOfProperties,我不想改变它的结构)。
所以我决定创建一个名为SpecialTaskFromListOfProperties的类,实现isspecialtask并使用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实际上是适配器模式吗?
适配器模式和装饰器模式之间的区别是什么?
从原始的GoF书中,适配器模式[Black Wasp][Wikipedia] 的目的是…
将类的接口转换为客户端期望的另一个接口。适配器允许类一起工作,否则由于接口不兼容而无法工作。
而Decorator模式[Black Wasp][Wikipedia] 的目的是…
动态地为对象附加额外的职责。装饰器为扩展功能提供了一个灵活的选择,而不是子类化。
虽然模式是相似的,但从定义中可以清楚地看出这是适配器模式。你有一个方形的钉子(TaskFromListOfProperties
),需要适合一个圆孔(ISpecialTask
),所以你已经适应了它使用SpecialTaskFromListOfProperties
。
装饰器将增加/扩展TaskFromListOfProperties
的现有功能,即它不会改变其现有的接口。这不是SpecialTaskFromListOfProperties
正在做的。
这取决于你真正想要达到的目标。Adapter和Decorator非常相似,但是当您实现Adapter时,除了转换之外,您不会带来任何新的逻辑。当实现Decorator时,你实际上带来了一些全新的功能,这些功能在你正在装饰的对象中从未存在过。
所以,长话短说,如果接口属性Id
, WorkerId
等自然来自TaskWithListOfProperties
-那么你应该考虑它作为一个适配器。否则它是一个装饰。