דפוס עיצוב מרוכב בג'אווה

1. הקדמה

במדריך מהיר זה נציג את דפוס העיצוב המרוכב בג'אווה.

אנו מתארים את המבנה ואת מטרת השימוש בו.

2. המבנה

התבנית המורכבת נועדה לאפשר התייחסות לאובייקטים בודדים ולהרכבים של אובייקטים, או "מרוכבים" באותו אופן.

ניתן לראות בו מבנה עץ המורכב מסוגים היורשים סוג בסיס, והוא יכול לייצג חלק בודד או היררכיה שלמה של אובייקטים.

אנו יכולים לפרק את התבנית ל:

  • רכיב - הוא ממשק הבסיס לכל האובייקטים בקומפוזיציה. זה צריך להיות ממשק או שיעור מופשט עם השיטות הנפוצות לניהול המרכיבים של הילדים.
  • עלה - מיישם את התנהגות ברירת המחדל של רכיב הבסיס. הוא אינו מכיל התייחסות לאובייקטים האחרים.
  • מורכב - בעל אלמנטים עלים. הוא מיישם את שיטות רכיב הבסיס ומגדיר את הפעולות הקשורות לילדים.
  • לקוח - יש גישה לאלמנטים קומפוזיציה באמצעות אובייקט רכיב הבסיס.

3. דוגמה מעשית

עכשיו, בואו נצלול ליישום. נניח אנו רוצים לבנות מבנה היררכי של מחלקות בחברה.

3.1. רכיב הבסיס

כאובייקט רכיב נגדיר פשוט מַחלָקָה מִמְשָׁק:

מחלקת ממשק ציבורי {void printDepartmentName (); }

3.2. עלים

עבור רכיבי העלה, נגדיר שיעורים למחלקות פיננסיות ומכירות:

מחלקה ציבורית ממחלקת FinancialDepartment בכיתה {מזהה שלם פרטי; שם מחרוזת פרטי; חלל ציבורי printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // קונסטרוקטור סטנדרטי, גטרים, סטרים}

כיתת העלים השנייה, מחלקת מכירות, דומה:

מחלקה ציבורית ממחלקת SalesDepartment מיישמת את מחלקת {מזהה שלם פרטי; שם מחרוזת פרטי; חלל ריק printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // קונסטרוקטור סטנדרטי, גטרים, סטרים}

שני הכיתות מיישמות את printDepartmentName () שיטה ממרכיב הבסיס, שם הם מדפיסים את שמות הכיתות לכל אחד מהם.

כמו כן, מכיוון שהם שיעורי עלים, הם אינם מכילים אחרים מַחלָקָה חפצים.

לאחר מכן, בואו נראה גם שיעור מורכב.

3.3. האלמנט המרוכב

ככיתה מורכבת, בואו ניצור a ראש מחלקה מעמד:

מחלקת HeadDepartment בכיתה ציבורית מיישמת את מחלקת {מזהה שלם פרטי; שם מחרוזת פרטי; רשימת ילדים פרטי מחלקות; HeadDepartment ציבורי (מזהה שלם, שם מחרוזת) {this.id = id; this.name = שם; this.childDepartments = ArrayList חדש (); } public public printDepartmentName () {childDepartments.forEach (מחלקה :: printDepartmentName); } addidepartment public void (מחלקת מחלקה) {childDepartments.add (מחלקה); } בטל ציבורי removeDepartment (מחלקת מחלקה) {childDepartments.remove (מחלקה); }}

זוהי מחלקה מורכבת שכן היא מחזיקה אוסף של מַחלָקָה רכיביםוכן שיטות להוספה והסרה של אלמנטים מהרשימה.

המורכב printDepartmentName () השיטה מיושמת על ידי איטרציה ברשימת אלמנטים העלים והפעלת השיטה המתאימה לכל אחת.

4. בדיקות

למטרות בדיקה, בואו נסתכל על א CompositeDemo מעמד:

מחלקה ציבורית CompositeDemo {main public public static (טענות מחרוזת []) {מחלקת salesDepartment = מחלקת מכירות חדשה (1, "מחלקת מכירות"); מחלקה פיננסית מחלקה = מחלקה פיננסית חדשה (2, "מחלקת פיננסים"); HeadDepartment headDepartment = HeadDepartment חדש (3, "מחלקת ראשים"); headDepartment.addDepartment (salesDepartment); headDepartment.addDepartment (FinancialDepartment); headDepartment.printDepartmentName (); }}

ראשית, אנו יוצרים שני מקרים עבור מחלקת הפיננסים והמכירות. לאחר מכן אנו מיישרים את המחלקה הראשית ומוסיפים לה את המופעים שנוצרו בעבר.

לבסוף, אנו יכולים לבדוק את printDepartmentName () שיטת קומפוזיציה. כפי שאנו מצפים, הפלט מכיל את שמות המחלקות של כל רכיב עלים:

מחלקת מכירות פיננסית מחלקה

5. מסקנה

במאמר זה למדנו על דפוס העיצוב המורכב. הכתיבה מדגישה את המבנה הראשי ומדגימה את השימוש באמצעות הדוגמה המעשית.

כרגיל, הקוד השלם זמין בפרויקט Github.


$config[zx-auto] not found$config[zx-overlay] not found