2011-08-09 39 views
4

我有2個項目:A和B應該互相交互。這叫做適配器嗎? +適配器vs修飾器

  1. 項目A介紹接口名稱ISpecialTask​​和項目B應該實現它。

  2. Projet B有一個名爲TaskWithListOfProperties的實體,它不能實現ISpecialTask​​,因爲它具有不同的屬性結構(此外,所有系統都知道如何使用TaskWithListOfProperties,我不想改變它的結構)。

所以我決定創建一個類名爲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實際上是Adapter模式嗎?
適配器模式和裝飾器模式有什麼區別?

回答

7

取決於您實際嘗試實現的目標。 適配器裝飾器是非常相似,但是當您實現適配器除了轉換之外,您沒有任何新的邏輯。當實施修飾器時,您實際上會引入一些前所未有的全新功能。

所以,長STOR總之,如果接口性能IdWorkerId等便自然TaskWithListOfProperties出來的話 - 那麼你應該考慮它作爲一個適配器。否則,這是一個修飾器

+1

Id,WorkerId等來自TaskWithListOfProperties的成員(屬性成員)。所以這是適配器,因爲我用它來適應存在接口而不添加新行爲? – Naor

+1

正確。這是一個適配器 – Vitaly

11

original GoF book,Adapter模式[Black Wasp][Wikipedia]的意圖是......

一類的接口轉換成另一個接口的客戶期望。適配器讓類可以協同工作,否則就會因爲不兼容的接口而無法工作。

雖然裝飾模式[Black Wasp][Wikipedia]的意圖是...

附加額外的責任到對象動態。裝飾器提供了一種靈活的替代方法來擴展功能。

儘管模式類似,但從定義中可以明顯看出,這是適配器模式。你有一個需要適合圓孔(ISpecialTask)的方形掛鉤(TaskFromListOfProperties),所以你已經使用SpecialTaskFromListOfProperties來調整它。

裝飾器將增加/擴展TaskFromListOfProperties的現有功能,即它不會改變其現有接口。這不是SpecialTaskFromListOfProperties正在做的事情。

+0

在大多數情況下,裝飾器實際上擴展了它裝飾的對象的接口。更改在接口實現方法中封裝的功能 - 更多的是模板方法,但不包括適配器或裝飾器。 – Vitaly

+0

@Vitaly擴展接口與更改/轉換接口不同。前者是加法的,後者是變革性的。此外,這當然不是模板方法模式,它涉及將算法的步驟推遲到子類中的方法。 – FishBasketGordo