2013-10-18 7 views
6

सजावटी डिजाइन पैटर्न में हमारे पास एक आइटम क्लास (पी.ई. कॉफी) है, फिर एक सार डिटेक्टर (पी। कॉफी डिकोरेटर) जिसमें कॉफी, और कंक्रीटडिकोटर (जैसे दूध) का संदर्भ शामिल है। मेरा सवाल यह है कि हमें सार डिटेक्टरेटर कक्षा की आवश्यकता क्यों है, क्यों कंक्रीट सजावटी कॉफी वर्ग से सीधे उत्तराधिकारी नहीं हैं? या हमारे पास एक इंटरफ़ेस क्यों नहीं है जिसमें आइटम क्लास प्रॉपर्टी है, यदि हम पहले से ही यह सुनिश्चित करना चाहते हैं कि कंक्रीटडिकोटर के पास आइटम क्लास का संदर्भ है? इस सार डिकोरेटर का उपयोग करके Bu हम केवल एक विकल्प अक्षम कर रहे हैं कि हमारे कंक्रीटडिकोटर कुछ अन्य वर्ग का उत्तराधिकारी हैं। अग्रिम में धन्यवाद!सजावटी पैटर्न में अमूर्त सजावटी वर्ग का उपयोग

उत्तर

1

हम कंक्रीट कक्षाओं से डुप्लिकेशन को हटाने के लिए अमूर्त कक्षाओं का उपयोग करते हैं। सजावटी पैटर्न में आपके पास सजाए गए ऑब्जेक्ट इंस्टेंस को संग्रहीत करने और इसे कॉल करने का दोहराव है। यदि आप इस तर्क को आधार (सार) सजावट में नहीं ले जाएंगे, तो आपको इसे प्रत्येक ठोस सजावट में लागू करने की आवश्यकता होगी।


पेय इंटरफ़ेस निम्नलिखित पर विचार करें:

public interface IBeverage 
{ 
    decimal Price { get; } 
    string Description { get; } 
} 

जो कॉफी द्वारा कार्यान्वित किया जाता:

public class Coffee : IBeverage 
{ 
    public decimal Price 
    { 
     get { return 3.5M; } 
    } 

    public string Description 
    { 
     get { return "Coffee"; } 
    } 
} 

अब आप कॉफी के लिए पहले डेकोरेटर बनाना चाहते हैं। इस समय आपको अमूर्त सजावटी बनाने की आवश्यकता नहीं है। हमारे दूध मधुमक्खी मुक्त होने दें। बस आपको सबसे सरल कोड लिखने की आवश्यकता होगी:

public class Milk : IBeverage 
{ 
    private readonly IBeverage _beverage; 

    public Milk(IBeverage beverage) 
    { 
     _beverage = beverage; 
    } 

    public decimal Price 
    { 
     get { return _beverage.Price; } // price not changed 
    } 

    public string Description 
    { 
     get { return _beverage.Description + " with milk"; } 
    } 
} 

अब आपको एक और सजावट की आवश्यकता है। यह क्रीम हो:

public class Cream : IBeverage 
{ 
    private readonly IBeverage _beverage; 

    public Cream(IBeverage beverage) 
    { 
     _beverage = beverage; 
    } 

    public decimal Price 
    { 
     get { return _beverage.Price + 2M; } 
    } 

    public string Description 
    { 
     get { return _beverage.Description + " with cream"; } 
    } 
} 

आप डुप्लिकेट किए गए कोड देख सकते हैं। तो, यह refactoring करने का समय है। के सार डेकोरेटर वर्ग है, जो जिम्मेदारी सजाया पेय के संदर्भ में पकड़े किया जाएगा और यह करने के लिए कॉल गुजर आधार पर डुप्लिकेट किए गए कोड चलते हैं:

public abstract class BeverageDecorator : IBeverage 
{ 
    private readonly IBeverage _beverage; 

    public BeverageDecorator(IBeverage beverage) 
    { 
     _beverage = beverage; 
    } 

    public virtual decimal Price 
    { 
     get { return _beverage.Price; } 
    } 

    public virtual string Description 
    { 
     get { return _beverage.Description; } 
    } 
} 

अब आप केवल उन कॉल जो व्यवहार अपने डेकोरेटर द्वारा बदला ओवरराइड कर सकते हैं। दूध सजावट इस तरह दिखेगा:

public class Milk : BeverageDecorator 
{ 
    public Milk(IBeverage beverage) 
     : base(beverage) 
    { 
    } 

    public override string Description 
    { 
     get 
     { 
      return base.Description + " with milk"; 
     } 
    } 
} 

अधिक क्लीनर, हाँ? यही कारण है कि हम बेस सजावट का उपयोग करते हैं।

+0

ठीक है, मैं सहमत हूं। लेकिन क्या यह भुगतान करने के लिए एक छोटी सी कीमत नहीं है, अगर आपके पास अब विलासिता है कि आपकी ठोस सजावट आवश्यक होने पर किसी अन्य वर्ग को लागू कर सकती है? मैं अभी भी इस पैटर्न को सही करने की कोशिश कर रहा हूं, इसलिए शायद मुझे कुछ याद आ रहा है? – Marko

+1

ठीक है, अब आपके कोड को देखते हुए मुझे एहसास हुआ कि किसी ऑब्जेक्ट को सजाए जाने के संदर्भ को संदर्भित करने से कहीं अधिक लाभ है ... इस तरह आप अपने कंक्रीट सजावट के लिए समान व्यवहार को समाहित करते हैं। लेकिन फिर भी, मेरे सिर में एक आवाज है कि यह अच्छा होगा अगर आप उस कंक्रीट सजावटी को कार्यान्वयन के लिए खोल सकते हैं ... :) – Marko

+1

@breakpoint क्षमा करें, समस्या नहीं मिली। डुप्लिकेशंस हमेशा बुरा होता है, इसलिए आपको इससे बचने की ज़रूरत है। आपको अमूर्त सजावटी से सभी सज्जाकारों को वारिस करने के लिए मजबूर नहीं किया जाता है। यदि कंक्रीट सजावट में से किसी एक को किसी अन्य वर्ग को लागू करना चाहिए, तो उसे उस दूसरे वर्ग से प्राप्त करें और सीधे आईबीवरेज लागू करें। बीटीडब्ल्यू कुछ अन्य वर्गों के उत्तराधिकारी के लिए यह बहुत अजीब आवश्यकता है। इस मामले में विरासत की बजाय संरचना का उपयोग करने पर विचार करें। –

संबंधित मुद्दे