2012-09-24 38 views
5

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

मेरे खोज समारोह पर, मैं खोज के 3 प्रकार है

  1. एक पैरामीटर, और अन्य, कई मापदंडों के साथ
  2. खोज, पैरामीटर के बिना
  3. खोज के साथ खोज।

मेरा सवाल है, डीएओ विधि करने का सबसे अच्छा तरीका क्या है?

मेरी struts2 विधि में

, मैं

public String execute() { 

    //assuming these are passed in from JSP 
    if ("searchByAnId".equals(paramSearch)) 
    { 
     List<DTO> datalist = this.someDao.implementList(theIdParam); 

    } else if("searchByAnOtherParam".equals(paramSearch)) 
    { 
     List<DTO> datalist = this.someDao.implementAnotherList(param1, param2, param3, param4) 
     // more params 
    } else 
    { 
     List<DTO> datalist = this.someDao.implementListAll(); 
    }  

    return "success"; 
} 

मैं ऐसे फैक्टरी तरीकों, डेकोरेटर के तरीकों, ऑब्जर्वर पद्धति के रूप में डिजाइन पैटर्न पर पढ़ रहा था हो रही है, लेकिन मुझे यकीन है कि जो एक सबसे उपयुक्त लोगों को है नहीं था (या तीसरे पक्ष प्लगइन के बिना कुछ और) यह सूट?

+1

मेरी प्रोजेक्ट में, मैंने एक सर्चक्रिटिया ऑब्जेक्ट बनाया जिसमें तालिका के कॉलम शामिल हैं जिसके लिए डीएओ संबंधित है। फिर आप इस सर्चक्रिटिया ऑब्जेक्ट्स में विवरण प्रदान करते हैं और अपने डीएओ के अंदर उस पर आधारित खोज करते हैं। – Atul

+0

और हाँ, मुझे नहीं लगता कि इस के लिए कोई विशिष्ट डिजाइन पैटर्न है। – Atul

उत्तर

6

मैं आमतौर पर इस तरह के रूप में मेरे सभी डोमेन संस्थाओं के लिए सामान्य तरीके, की परिभाषा के साथ एक बुनियादी दाव इंटरफ़ेस बनाने के लिए करते हैं:

// marker interface 
public interface DomainEntity extends Serializable { } 

// common dao methods 
public interface DAO<T extends DomainEntity> { 
    public T findById(Long id); 
    public List<T> findAll(); 
    public T save(T entity); 
    public boolean update(T entity); 
    public boolean delete(T entity); 
} 

और फिर मेरी आवश्यकताओं के आधार पर एक या अधिक कार्यान्वयन प्रदान करते हैं:

// implementation of common dao methods using JPA 
public class JpaDAO<T> implements DAO<T> { 

    private EntityManager em; 

    public JpaDao(EntityManager em) { this.em = em; } 

    // Default implementations using JPA... 
} 

// implementation of common dao methods using JDBC 
public class JdbcDAO<T> implements DAO<T> { 

    private Connection conn; 

    public JdbcDao(Connection conn) { this.conn = conn; } 

    // Default implementations using JDBC 
} 
अब

, यह मानते हुए मैं निम्नलिखित व्यक्ति वर्ग है:

public class Person implements DomainEntity { 
    private Long id; 
    private String firstName; 
    private String lastName; 

    // getters/setters... 
} 

मैं पहली बार इतनी तरह एक सामान्य PersonDAO इंटरफेस को परिभाषित:

public interface PersonDAO implements DAO<Person> { 
    public List<Person> findByFirstName(String name); 
    public List<Person> findByLastName(String name); 
} 

ध्यान दें कि ऊपर मेरी विशेष इकाई दाव इंटरफ़ेस में, मैं केवल अतिरिक्त तरीकों जो मेरे डोमेन इकाई के लिए विशिष्ट हैं शामिल किया है। सामान्य इंटरफेस सुपर इंटरफेस द्वारा विरासत में प्राप्त होते हैं और जेनेरिक का उपयोग करके मेरी डोमेन इकाई में पैरामीटर किए जाते हैं।

package mypackage.daos.jpa; 

public class PersonDAOImpl extends JpaDAO<Person> implements PersonDAO { 
    // here i implement only the entity specific dao methods 
    // defined in the last interface. 
} 

(जेपीए के बजाय JDBC के आधार पर कहते हैं) मैं भी एक विकल्प के डीएओ कार्यान्वयन प्रदान करने के लिए की जरूरत है,:

अब अंतिम शेष बात तो की तरह, मेरे इकाई विशिष्ट विधियों के विभिन्न कार्यान्वयन को परिभाषित करने के लिए है

package mypackage.daos.jdbc; 

public class PersonDAOImpl extends JdbcDAO<Person> implements PersonDAO { 
    // again i only implement the entity specific DAO methods since 
    // defaults have been implemented in the super class... 
} 

इस बारे में अच्छी बात यह है कि आप बुला कोड है कि से प्रभावित करने के लिए बिना कार्यान्वयन स्विच कर सकते हैं है: एक द्वितीय श्रेणी बनाने (अधिमानतः एक अलग पैकेज में) के रूप में अपनी के रूप में आसान

// a service class that uses my dao 
public class PersonService { 

    private PersonDAO dao; 

    public PersonService(PersonDAO dao) { this.dao = dao } 

    public void doSomethingUseful() { 
    // use the dao here... 
    } 
} 

आमतौर पर, उचित दाव कार्यान्वयन (JDBC या जेपीए) सेवा निर्माण के दौरान निर्माता के माध्यम से इंजेक्ट किया जाएगा। बेशक आप केवल एक ही कार्यान्वयन कर सकते हैं यदि आप चाहें (यानी जेपीए)।

+0

तो बस पुष्टि करने के लिए, "इंटरफ़ेस PersonDAO" और "DAO " के बीच संबंध क्या है? माफी, मैं डिजाइन पैटर्न पर बहुत खराब हूं ... –

+0

इंटरफ़ेस डीएओ एक प्रकार पैरामीटरयुक्त इंटरफेस है जो डीएओ ऑपरेशंस को परिभाषित करता है जो सभी डोमेन इकाइयों के लिए आम हैं। इंटरफेस PersonDAO (जो डीएओ फैलाता है) में ऐसे ऑपरेशन शामिल होते हैं जो व्यक्ति डोमेन इकाई के विशिष्ट होते हैं। –

+0

जेनेरिक पर्सनडाओ के बारे में - क्या इसे 'इंटरफेस' के बजाय इंटरफ़ेस पर्सडाडाओ दाओ 'को नहीं पढ़ाना चाहिए? – Louise