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

时间:2011-08-09 16:51:34

标签: c# .net design-patterns decorator adapter

我有两个项目:A和B应该相互交互。

  1. 项目A介绍接口名称ISpecialTask​​和项目B应该实现它。

  2. Projet B有一个名为TaskWithListOfProperties的实体,它不能实现ISpecialTask​​,因为它具有不同的属性结构(此外,所有系统都知道如何使用TaskWithListOfProperties并且我不想更改其结构)。

  3. 所以我决定创建一个名为SpecialTask​​FromListOfProperties的类来实现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{ ... } }
    }
    

    SpecialTask​​FromListOfProperties实际上是适配器模式吗?
    适配器模式和装饰器模式之间有什么区别?

2 个答案:

答案 0 :(得分:11)

original GoF book开始,适配器模式的目的 [Black Wasp] [Wikipedia] 是......

  

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

虽然装饰器模式 [Black Wasp] [Wikipedia] 的意图是...

  

动态地将附加职责附加到对象。装饰器为子类化提供了灵活的替代方法,以扩展功能。

虽然模式类似,但从定义来看,很明显这是适配器模式。你有一个方形钉(TaskFromListOfProperties)需要放入圆孔(ISpecialTask),所以你已经使用SpecialTaskFromListOfProperties进行了调整。

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

答案 1 :(得分:8)

取决于您实际想要实现的目标。 适配器装饰器非常相似,但是当您实施适配器时,除了转换之外,您不会带来任何新逻辑。在实施装饰器时,您实际上会引入一些以前从未在您装饰的对象中存在过的全新功能。

因此,长话短说,如果界面属性IdWorkerId等自然来自TaskWithListOfProperties - 那么您应该将其视为适配器。否则它是装饰器