Nao*_*aor 4 .net c# design-patterns decorator adapter
我有两个项目: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实际上是适配器模式吗?
适配器模式和装饰器模式有什么区别?
Fis*_*rdo 11
从最初的GoF书中,适配器模式[Black Wasp] [Wikipedia]的意图是......
将类的接口转换为客户期望的另一个接口.适配器允许类一起工作,否则由于不兼容的接口.
动态附加对象的附加职责.装饰器为子类化提供了灵活的替代方法,以扩展功能.
虽然模式类似,但从定义来看,很明显这是适配器模式.你有一个方形钉(TaskFromListOfProperties)需要适合圆孔(ISpecialTask),所以你已经使用了它SpecialTaskFromListOfProperties.
装饰器将增加/扩展现有功能TaskFromListOfProperties,即它不会改变其现有接口.这不是SpecialTaskFromListOfProperties正在做的事情.
取决于你实际想要实现的目标.Adapter和Decorator非常相似,但是当你实现一个Adapter时,除了转换之外你不会带来新的逻辑.在实现装饰器时,您实际上会引入一些以前从未在您正在装饰的对象中存在的全新功能.
所以,长话短说,如果接口特性Id,WorkerId等自然来自哪里TaskWithListOfProperties-那么你应该考虑它作为一个适配器.否则它是装饰者.