2013-01-24 20 views
8

में मान ऑब्जेक्ट्स (विरासत) मान्य करें मैं सिस्टम के किसी अन्य भाग पर जाने से पहले अपने डोमेन ऑब्जेक्ट्स को सत्यापित करना चाहता हूं। सभी ऑब्जेक्ट जिन्हें मैं मान्य करना चाहता हूं उसी इंटरफ़ेस को साझा करना चाहता हूं। समस्या यह है कि मैं यह नहीं समझ सकता कि इसे कैसे अच्छी तरह से लिखना है। मैं अपने मूल्य वस्तु के अंदर सत्यापन को स्थानांतरित नहीं करना चाहता हूं। लेकिन मैं एक उदाहरण करने के लिए मजबूर नहीं होना चाहता हूं या तो जांच करें।जावा

एक उदाहरण:

public interface Vehicle {} 

public class Car implements Vehicle {} 

public class MotorBike implements Vehicle {} 

public interface VehicleValidator { 
    void validate(); 

} 

public class CarValidator implements VehicleValidator { 

    @Override 
    public void validate() {} 
} 

public class MotorBikeValidator implements VehicleValidator { 

    @Override 
    public void validate() {} 
} 

public void process(Vehicle vehicle) { 
    //TODO: validate vehicle 
    doSomething(vehicle); 
} 

स्काला में मैं http://debasishg.blogspot.se/2010/06/scala-implicits-type-classes-here-i.html लेकिन उन भाषा निर्माणों को कुछ इसी तरह किया होता जावा में संभव नहीं है।

+2

यह एक बहुत लगता है:

आप वाहन है, जो गतिशील रूप से रनटाइम पर सत्यापनकर्ता की उचित विधि के लिए बाध्य होंगे में कॉल-बैक कोड का एक छोटा सा जोड़ने की जरूरत [* विज़िटर पैटर्न *] के बारे में (http://en.wikipedia.org/wiki/Visitor_pattern)। –

+0

आप वैल्यू ऑब्जेक्ट में सत्यापन विधि क्यों नहीं रखना चाहते हैं? जैसा कि यह है, भले ही आप इंटरफ़ेस पदानुक्रम को साफ करते हैं, फिर भी आपको मूल्य वस्तुओं के प्राकृतिक पदानुक्रम का समर्थन करने के लिए, सत्यापनकर्ता कार्यान्वयन को श्रृंखलाबद्ध करने की आवश्यकता होगी। – Perception

+0

जिज्ञासा से बाहर, क्या इस परिदृश्य में एक उदाहरण का उपयोग करने के खिलाफ कोई कारण है? – Zylth

उत्तर

0

जैसा ओली चार्ल्सवर्थ ने अपनी टिप्पणी में लिखा था, यह आमतौर पर विज़िटर पैटर्न द्वारा किया जाता है। http://en.wikipedia.org/wiki/Visitor_pattern

उस विकी पेज पर अच्छा जावा उदाहरण है।

0

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

मैं रणनीति पैटर्न समझाने के लिए जा सकते हैं, लेकिन यह यहाँ बेहतर किया है: http://www.javacodegeeks.com/2012/04/strategy-pattern.html (वसंत के साथ)

कई व्यवस्थाएं कक्षाएं बाहर के बॉक्स इस सुविधा के लिए होगा।

2

यह Double Dispatch डिज़ाइन पैटर्न के लिए क्लासिक केस है। जैसे आप पूछ रहे हैं

public interface Vehicle { 
    void validate(Validator validator); 
} 

public class Car implements Vehicle { 
    public void validate(Validator validator) { 
     validator.validateCar(this); 
    } 
} 

public class MotorBike implements Vehicle { 
    public void validate(Validator validator) { 
     validator.validateMotorBike(this); 
    } 
} 

public class Validator { 
    public void validateCar(Car car) { 
     // validate a car 
    } 

    public void validateMotorBike(MotorBike motorBike) { 
     // validate a motorbike 
    } 
} 

public void process(Vehicle vehicle) { 
    Validator validator = new Validator(); 
    vehicle.validate(validator); 
    doSomething(vehicle); 
} 
+0

पर सवाल उठाया गया है, लेकिन सत्यापन में कोड उप प्रकार विशिष्ट है। – Taylor

+0

@ टेलर ओएमजी। यही कोड है! मैंने कोड संपादित किया है और विधि नाम बदल दिया है और – Bohemian

+0

को स्पष्ट करने में सहायता के लिए टिप्पणियां जोड़ दी हैं, मुझे कुछ याद आना चाहिए, अब मैं इसे देखता हूं। मेरा डरपोक – Taylor