תבנית הקישוטים בג'אווה

1. סקירה כללית

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

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

2. דוגמא לתבנית מעצב

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

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

ממשק ציבורי ChristmasTree {מחרוזת לקשט (); }

היישום של ממשק זה ייראה כך:

מחלקה ציבורית ChristmasTreeImpl מיישמת את ChristmasTree {@Override מחרוזת ציבורית לקשט () {להחזיר "עץ חג המולד"; }}

כעת ניצור תקציר TreeDecorator כיתה לעץ זה. מעצב זה יישם את עץ חג המולד ממשק וכן להחזיק את אותו אובייקט. השיטה המיושמת מאותו ממשק פשוט תקרא לְקַשֵׁט() שיטה מהממשק שלנו:

מחלקה מופשטת ציבורית TreeDecorator מיישמת את חג המולד {עץ פרטי של חג המולד; // קונסטרוקציות סטנדרטיות @ Override ציבורי מחרוזת לקשט () {return tree.decorate (); }}

כעת ניצור אלמנט קישוט כלשהו. מעצבים אלה יאריכו את התקציר שלנו TreeDecorator בכיתה ותשנה את לְקַשֵׁט() שיטה על פי הדרישה שלנו:

מחלקה ציבורית BubbleLights מרחיבה את TreeDecorator {BubbleLights הציבור (עץ עץ חג המולד) {סופר (עץ); } לקשט מחרוזת ציבורית () {להחזיר super.decorate () + decorateWithBubbleLights (); } מחרוזת פרטית decorateWithBubbleLights () {להחזיר "עם אורות בועה"; }}

במקרה זה הדבר נכון:

@ מבחן ציבורי בטל כאשר דקורטורים InjectedAtRuntime_thenConfigSuccess () {ChristmasTree tree1 = גרלנדה חדשה (ChristmasTreeImpl חדש ()); assertEquals (tree1.decorate (), "עץ חג המולד עם זר"); עץ עץ חג המולד 2 = אורות BubbleLights חדשים (גרלנד חדש (גרלנד חדש (ChristmasTreeImpl חדש ()))); assertEquals (tree2.decorate (), "עץ חג המולד עם זר עם זר עם אורות בועה"); }

שים לב שבראשון עץ 1 חפץ, אנחנו מקשטים אותו רק באחד זֵרואילו השני עץ 2 אובייקט שאנחנו מקשטים באחד BubbleLights ושתיים זרים. דפוס זה נותן לנו גמישות זו להוסיף כמה מעצבים שנרצה בזמן הריצה.

4. מסקנה

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

  • כשאנחנו רוצים להוסיף, לשפר או אפילו להסיר את ההתנהגות או מצב האובייקטים
  • כאשר אנו רק רוצים לשנות את הפונקציונליות של אובייקט יחיד בכיתה ולהשאיר אחרים ללא שינוי

קוד המקור המלא לדוגמא זו זמין ב- GitHub.


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