这叫适配器吗?+适配器vs装饰器

本文关键字:适配器 vs | 更新日期: 2023-09-27 18:05:14

我有两个项目:A和B,应该相互作用。

  1. 项目A引入接口名称ispecaltask,项目B执行。

  2. 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实际上是适配器模式吗?
适配器模式和装饰器模式之间的区别是什么?

这叫适配器吗?+适配器vs装饰器

从原始的GoF书中,适配器模式[Black Wasp][Wikipedia] 的目的是…

将类的接口转换为客户端期望的另一个接口。适配器允许类一起工作,否则由于接口不兼容而无法工作。

而Decorator模式[Black Wasp][Wikipedia] 的目的是…

动态地为对象附加额外的职责。装饰器为扩展功能提供了一个灵活的选择,而不是子类化。

虽然模式是相似的,但从定义中可以清楚地看出这是适配器模式。你有一个方形的钉子(TaskFromListOfProperties),需要适合一个圆孔(ISpecialTask),所以你已经适应了它使用SpecialTaskFromListOfProperties

装饰器将增加/扩展TaskFromListOfProperties的现有功能,即它不会改变其现有的接口。这不是SpecialTaskFromListOfProperties正在做的。

这取决于你真正想要达到的目标。AdapterDecorator非常相似,但是当您实现Adapter时,除了转换之外,您不会带来任何新的逻辑。当实现Decorator时,你实际上带来了一些全新的功能,这些功能在你正在装饰的对象中从未存在过。

所以,长话短说,如果接口属性Id, WorkerId等自然来自TaskWithListOfProperties -那么你应该考虑它作为一个适配器。否则它是一个装饰