2013-10-20 87 views
0

我發現自己越來越頻繁地使用以下設計,而我的直覺說這是一種代理類型,因爲我沒有真正添加太多功能。我懷疑它的唯一原因是因爲代碼更像是我看到的裝飾器例子!這是一個代理模式或裝飾模式的例子

您認爲如何?

class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public virtual string Address { get; set; } 
} 

class PersonProxyOrDecarator : Person 
{ 
    private Lazy<string> _address; 
    public PersonProxyOrDecarator(PersonRepository repository) 
    {     
     _address = new Lazy<string>(()=> repository.LoadAddress(this)); 
    } 

    public override string Address 
    { 
     get 
     { 
      return _address.Value; 
     } 
     set { throw new NotImplementedException(); } 
    } 
} 

class PersonRepository 
{ 
    public IEnumerable<Person> LoadPeople() 
    { 
     return new List<Person>(){ 
      new PersonProxyOrDecarator(this){ Name="Test",Age=18 } 
     }; 
    } 
    public string LoadAddress(Person person) 
    { 
     return "Address loaded from webservice"; 
    } 
} 

這不是問題而是人的實體類通常會坐在不同的組件(域組件),以及personproxyordecorator類和庫會坐在一個集儲存庫。

感謝

羅斯

+0

對我來說,這是一個代理。爲了成爲一個裝飾者,我希望它會爲'LoadAddress'方法添加和/或改變功能,而你的實現只會延遲實際檢索作爲典型代理屬性的地址。 –

回答

0

我認爲這是兩者兼而有之。技術上從Person派生類使它成爲裝飾器,但由於你有一些加載邏輯,所以它也是一個代理。

0

IMO這既不是代理也不是裝飾,因爲這些模式需要一個對象被包裝,不僅子類。代理或裝飾者類同時使用繼承(ProxyPerson is-a Person)和組合(ProxyPerson has-a Person)。 PersonProxyOrDecarator沒有Person字段,因此它不控制/裝飾Person對象,而是一個(子類)Person對象。代理是裝飾者的特例。

有關這些模式的一些背景信息,請參閱DecoratorProxy

0

你不會從這個問題中得到一個簡單的答案 - 但它使一個有趣的討論。

它是代理服務器嗎?引述Wikipedia,代理類:

是一類功能爲別的東西的接口。

足夠模糊,但您的示例肯定會滿足您的要求 - 您的繼承類作爲Person類的網關。然而,這個代理的「通用」定義似乎適合於你可以作爲開發人員編寫的每一個類,所以我不確定沒有一些上下文是多麼有用(例如,如果我在面向服務的應用程序上下文中討論服務術語代理變得更有意義)。

它是一個裝飾者?是的!你的繼承類爲Address屬性添加了額外的裝飾(它不會讓你設置它)。

讓我們再投入一個 - 我建議它也是一個工廠 - 因爲您正在從繼承的類中「保溼」Person接口的屬性。