نمط الكيان المركب
الكيان المركب هو نمط تصميم برمجيات Java EE ، ويُستخدم لنمذجة وتمثيل وإدارة مجموعة من الكائنات المستمرة المترابطة بدلاً من تمثيلها ككيانات فردية دقيقة، كما يمثل الكيان المركب رسمًا بيانيًا للكائنات. [ 1 ]
بناء
توجد عدة استراتيجيات لتطبيق نمط الكيان المركب. يتكون هذا النمط بشكل أساسي من كيان مركب، وكائن ذي حبيبات خشنة، وكائنات تابعة. [ 1 ]

مكون الكيان المركب
الكيان المركب هو كيان ذو بنية عامة، والذي قد يكون هو الكائن ذو البنية العامة، أو قد يحتوي على مرجع إلى الكائن ذي البنية العامة. [ 1 ]
جسم خشن الحبيبات
الكائن ذو الحبيبات الخشنة هو كائن له دورة حياته الخاصة ويدير علاقاته الخاصة مع الكائنات الأخرى. يمكن أن يكون كائنًا موجودًا داخل الكيان المركب، أو يمكن أن يكون الكيان المركب نفسه هو الكائن ذو الحبيبات الخشنة الذي يحتوي على كائنات تابعة. [ 1 ]
الكائن التابع
هو كائن، يمكن أن يحتوي على كائنات تابعة أخرى (قد يكون هناك شجرة من الكائنات داخل الكيان المركب)، ويعتمد على الكائن ذي الحبيبات الخشنة وتتم إدارة دورة حياته بواسطة الكائن ذي الحبيبات الخشنة. [ 1 ]
عواقب
وفقًا لوصف أوراكل لهذا النمط، تشمل النتائج إزالة العلاقات بين الكيانات، وتحسين إمكانية الإدارة عن طريق تقليل عدد مكونات الكيانات، وتحسين أداء الشبكة، وتقليل الاعتماد على مخطط قاعدة البيانات، وزيادة دقة الكائنات، وتسهيل إنشاء كائنات النقل المركبة، وتقليل الحمل الزائد لرسوم بيانية الكائنات التابعة متعددة المستويات. [ 1 ]
العيوب
يتمثل العيب الرئيسي في اشتراط استخدام كائنات برمجية مُدارة بواسطة وحدة تحكم (BMP) . وهذا يتطلب جهدًا إضافيًا من المطورين، ويخلق بعض المشاكل كما يلي:
- إن تجسيد جميع البيانات في كيان ذي حجم كبير كلما تم الوصول إليها، أمر مكلف بشكل غير مقبول
- في لغة جافا ، يجب أن يكون تنفيذ طريقة ejbStore() ذكيًا بما يكفي لتجنب إصدار جميع التحديثات المطلوبة للاحتفاظ بالحالة الكاملة للكائن، ما لم تتغير البيانات في جميع الكائنات المستمرة.
لا يمكن تطبيق نمط الكيان المركب إلا باستخدام BMP أو بإضافة المزيد من منطق الثبات المكتوب يدويًا إلى مكونات الثبات المُدارة بواسطة الحاوية (CMP) . كلا النهجين يقللان من سهولة الصيانة. [ 2 ]
نموذج التعليمات البرمجية
قد يبدو نموذج التعليمات البرمجية لتطبيق أتمتة الخدمات الاحترافية (PSA) الذي يتم فيه تنفيذ كائن المورد عبر نمط الكيان المركب، كما يلي (الكيان ينفذ كائنًا ذا حبيبات خشنة):
package corepatterns.apps.psa.ejb ;استيراد corepatterns.apps.psa.core.* ؛ استيراد corepatterns.apps.psa.dao.* ؛ استيراد java.sql.* ؛ استيراد javax.sql.* ؛ استيراد java.util.* ؛ استيراد javax.ejb.* ؛ استيراد javax.naming.* ؛public class ResourceEntity implements EntityBean { public String employeeId ; public String lastName ; public String firstName ; public String departmentId ; public String practiceGroup ; public String title ; public String grade ; public String email ; public String phone ; public String cell ; public String pager ; public String managerId ; // مجموعة من الكائنات التابعة لـ BlockOutTime public Collection blockoutTimes ;// مجموعة من الكائنات التابعة لمجموعة المهارات العامة مجموعة المهارات ؛...private EntityContext context ; // تنفيذ أساليب Entity Bean public String ejbCreate ( ResourceTO resource ) throws CreateException { try { this.employeeId = resource.employeeId ; setResourceData ( resource ) ; getResourceDAO (). create ( resource ) ; } catch ( Exception ex ) { throw new EJBException ( "السبب:" + ... ) ; } return this.employeeId ; } public String ejbFindByPrimaryKey ( String primaryKey ) throws FinderException { boolean result ; try { ResourceDAO resourceDAO = getResourceDAO ( ) ; result = resourceDAO.selectByPrimaryKey ( primaryKey ) ; } catch ( Exception ex ) { throw new EJBException ( "السبب:" + ... ); } if ( result ) { return primaryKey ; } else { throw new ObjectNotFoundException (...); } } public void ejbRemove () { try { // إزالة الكائنات التابعة if ( this . skillSets != null ) {SkillSetDAO skillSetDAO = getSkillSetDAO () ; skillSetDAO.setResourceID ( employeeId ) ; skillSetDAO.deleteAll ( ) ; skillSets = null ; } if ( this.blockoutTime ! = null ) { BlockOutTimeDAO blockouttimeDAO = getBlockOutTimeDAO ( ) ; blockouttimeDAO.setResourceID ( employeeId ) ; blockouttimeDAO.deleteAll ( ) ; blockOutTimes = null ; }// إزالة المورد من المخزن الدائم ResourceDAO resourceDAO = new ResourceDAO ( employeeId ); resourceDAO.delete ( ); } catch ( ResourceException ex ) { throw new EJBException ( "السبب:" + ... ); } catch ( BlockOutTimeException ex ) { throw new EJBException ( "السبب:" + ... ); } catch ( Exception exception ) { ... } } public void setEntityContext ( EntityContext context ) { this.context = context ; } public void unsetEntityContext () { context = null ; } public void ejbActivate () { employeeId = ( String ) context.getPrimaryKey ( ); } public void ejbPassivate ( ) { employeeId = null ; } public void ejbLoad ( ) { try { // تحميل معلومات المورد من ResourceDAO resourceDAO = getResourceDAO (); setResourceData (( ResourceTO ) resourceDAO.load ( employeeId )); // تحميل الكائنات التابعة الأخرى، إذا لزم الأمر ... } catch ( Exception ex ) { throw new EJBException ( "السبب:" + ... ); } } public void ejbStore () { try { // تخزين معلومات المورد getResourceDAO (). update ( getResourceData ());// تخزين الكائنات التابعة حسب الحاجة ... } catch ( SkillSetException ex ) { throw new EJBException ( "السبب:" + ...); } catch ( BlockOutTimeException ex ) { throw new EJBException ( "السبب:" + ...); } ... } public void ejbPostCreate ( ResourceTO resource ) { }// دالة للحصول على كائن نقل الموارد public ResourceTO getResourceTO () { // إنشاء كائن نقل موارد جديد ResourceTO resourceTO = new ResourceTO ( employeeId );// نسخ جميع القيم resourceTO.lastName = lastName ; resourceTO.firstName = firstName ; resourceTO.departmentId = departmentId ; ... return resourceTO ; }public void setResourceData ( ResourceTO resourceTO ) { // نسخ القيم من كائن النقل إلى كائن الكيان employeeId = resourceTO . employeeId ; lastName = resourceTO . lastName ; ... }// دالة للحصول على كائنات النقل التابعة public Collection getSkillSetsData () { // إذا لم يتم تحميل مجموعة المهارات، فقم بتحميلها أولاً. // انظر إلى تطبيق استراتيجية التحميل الكسول.إرجاع مجموعات المهارات ؛ } ...// طرق أخرى للحصول على البيانات وتعيينها حسب الحاجة ...// طرق أعمال Entity bean العامة void addBlockOutTimes ( Collection moreBOTs ) throws BlockOutTimeException { // ملاحظة: moreBOTs هي مجموعة من // كائنات BlockOutTimeTO try { Iterator moreIter = moreBOTs . iterator (); while ( moreIter . hasNext ()) { BlockOutTimeTO botTO = ( BlockOutTimeTO ) moreIter . next (); if ( ! ( blockOutTimeExists ( botTO ))) { // إضافة BlockOutTimeTO إلى المجموعة botTO . setNew (); blockOutTime . add ( botTO ); } else { // BlockOutTimeTO موجود بالفعل، لا يمكن إضافته throw new BlockOutTimeException (...); } } } catch ( Exception exception ) { throw new EJBException (...); } }public void addSkillSet ( Collection moreSkills ) throws SkillSetException { // مشابه لتنفيذ addBlockOutTime() ... }...public void updateBlockOutTime ( Collection updBOTs ) throws BlockOutTimeException { try { Iterator botIter = blockOutTimes . iterator (); Iterator updIter = updBOTs . iterator (); while ( updIter . hasNext ()) { BlockOutTimeTO botTO = ( BlockOutTimeTO ) updIter . next (); while ( botIter . hasNext ()) { BlockOutTimeTO existingBOT = ( BlockOutTimeTO ) botIter . next (); // مقارنة قيم المفاتيح لتحديد موقع BlockOutTime if ( existingBOT . equals ( botTO )) { // تم العثور على BlockOutTime في المجموعة // استبدال BlockOutTimeTO القديم بالجديد botTO . setDirty (); // تم تعديل التابع القديم botTO . resetNew (); // ليس تابعًا جديدًا existingBOT = botTO ; } } } } catch ( Exception exc ) { throw new EJBException (...); } }public void updateSkillSet ( Collection updSkills ) throws CommitmentException { // مشابه لـ updateBlockOutTime... ... }...}[ 1 ]
انظر أيضاً
مراجع
- 1 2 3 4 5 6 7 "أنماط J2EE الأساسية - الكيان المركب" . أوراكل . أوراكل . تم الاطلاع عليه في 6 فبراير 2016 .
- ↑ جونسون، ر. (2003). تصميم وتطوير تطبيقات J2EE من خلال جلسات فردية مع خبراء . إنديانابوليس: وايلي للنشر، ص 290.
- أنماط تصميم البرمجيات
