JavaRush /בלוג Java /Random-HE /ההבדל בין דפוסי מדינה ואסטרטגיה ב-Java
0xFF
רָמָה
Донецк

ההבדל בין דפוסי מדינה ואסטרטגיה ב-Java

פורסם בקבוצה
על מנת להשתמש נכון בדפוסי המדינה והאסטרטגיה ביישומי ליבה של Java, חשוב למתכנתי Java להבין בבירור את ההבדל ביניהם . למרות שלשני הדפוסים, המדינה והאסטרטגיה, יש מבנה דומה, ושניהם מבוססים על העיקרון הפתוח/סגור, המייצג את ה-"O" בעקרונות SOLID , הם שונים לחלוטין בכוונה . ההבדל בין דפוסי מדינה ואסטרטגיה ב-Java - 1תבנית האסטרטגיה ב-Java משמשת כדי להכיל קבוצות קשורות של אלגוריתמים כדי לספק גמישות ביצוע ללקוח. הלקוח יכול לבחור כל אלגוריתם בזמן ריצה מבלי לשנות את ההקשר של המחלקה שמשתמשת ב- Strategy. כמה דוגמאות פופולריות של דפוס האסטרטגיה הן כתיבת קוד המשתמש באלגוריתמים, כגון הצפנה, דחיסה או מיון. מצד שני, דפוס המצב מאפשר לאובייקט להתנהג בצורה שונה במצבים שונים. מכיוון שבעולם האמיתי לחפץ יש לעתים קרובות מצבים, והוא מתנהג אחרת במצבים שונים, למשל, מכונה אוטומטית מוכרת סחורה רק אם היא במדינה hasCoin, היא לא נמכרת עד שאתה מכניס בה מטבע. עכשיו אתה יכול לראות בבירור את ההבדל בין דפוסי האסטרטגיה והמדינה, אלו כוונות שונות. דפוס המצב עוזר לאובייקט לנהל מצב, בעוד שתבנית האסטרטגיה מאפשרת ללקוח לבחור התנהגות אחרת. הבדל נוסף שלא כל כך קל לראות הוא מי מניע את השינוי בהתנהגות. במקרה של דפוס האסטרטגיה, זהו לקוח המספק אסטרטגיות שונות להקשר; בדפוס המצב, המעבר נשלט על ידי ההקשר או מצב האובייקט עצמו. בנוסף, אם אתה מנהל בעצמך שינויי מצב באובייקט ה-State, חייבת להיות הפניה להקשר, למשל, מכונה אוטומטית חייבת להיות מסוגלת לקרוא לשיטה setState()כדי לשנות את המצב הנוכחי של ההקשר. מצד שני, אובייקט האסטרטגיה לעולם אינו מכיל התייחסות להקשר; הלקוח עצמו מעביר את האסטרטגיה שבחר להקשר. ההבדל בין דפוסי מדינה לאסטרטגיה הוא אחת משאלות הראיונות הפופולריות על דפוסי Java , במאמר זה על דפוסי Java נסקור אותה מקרוב. נחקור כמה קווי דמיון והבדלים בין דפוסי האסטרטגיה והמצב ב-Java שיעזרו לך לשפר את ההבנה שלך של דפוסים אלה.

קווי דמיון בין דפוסי המדינה והאסטרטגיה

אם תסתכל על דיאגרמת UML של דפוסי המדינה והאסטרטגיה, תבחין ששניהם נראים דומים זה לזה. אובייקט שמשתמש ב-State כדי לשנות את התנהגותו מכונה Context-אובייקט, בדומה לאובייקט שמשתמש באסטרטגיה כדי לשנות את התנהגותו מכונה Context-אובייקט. זכור שהלקוח מקיים אינטראקציה עם Context-האובייקט. במקרה של תבנית המדינה, ההקשר מאציל שיטות קריאה לאובייקט State, המוחזק כאובייקט הנוכחי, ובמקרה של תבנית האסטרטגיה, ההקשר משתמש באובייקט האסטרטגיה כפרמטר או מסופק במהלך היצירה של ההקשר של האובייקט. דיאגרמת UML של תבנית המדינה ב-Java ההבדל בין דפוסי מדינה ואסטרטגיה ב-Java - 2 דיאגרמת UML זו עבור תבנית המדינה מתארת ​​את הבעיה הקלאסית של יצירת עיצוב מכונות אוטומטיות מונחה עצמים ב-Java. אתה יכול לראות שמצב המכונה האוטומטית מיוצג באמצעות ממשק, אשר לאחר מכן יש מימוש לייצוג המצב הספציפי. לכל מדינה יש גם הפניות להקשר האובייקט כדי לבצע מעבר למצב אחר כתוצאה מפעולות שנקראות בהקשר. דיאגרמת UML של דפוס האסטרטגיה ב-Java ההבדל בין דפוסי מדינה ואסטרטגיה ב-Java - 3 דיאגרמת UML זו עבור דפוס האסטרטגיה מכילה מימושים פונקציונליים למיניהם. מכיוון שישנם אלגוריתמי מיון רבים, דפוס עיצוב זה מאפשר ללקוח לבחור אלגוריתם בעת מיון אובייקטים. למעשה, מסגרת Java Collection משתמשת בדפוס זה כדי ליישם שיטה Collections.sort()המשמשת למיון אובייקטים ב-Java. ההבדל היחיד הוא שבמקום לאפשר ללקוח לבחור אלגוריתם מיון, הוא מאפשר לו לציין את אסטרטגיית ההשוואה על ידי העברת מופע של ממשק Comparator או Comparable ל-Java . בואו נסתכל על כמה קווי דמיון בין שני דפוסי העיצוב העיקריים הללו ב-Java:
  1. שני הדפוסים, המדינה והאסטרטגיה, מקלים על הוספת מצב ואסטרטגיה חדשים מבלי להשפיע על ההקשר של האובייקט שמשתמש בהם.

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

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

  4. דפוס המצב מייצג התנהגויות שונות בצורה של מצבי אובייקט שונים, בעוד שדפוס האסטרטגיה מייצג התנהגויות שונות בצורה של אסטרטגיות אובייקט שונות.

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

הבדלים בין דפוסי אסטרטגיה ומצב ב-Java

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

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

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

  4. ניתן להעביר יישום של אסטרטגיה כפרמטר לאובייקט שישתמש בה, למשל Collection.sort() לוקח Comparator שהוא אסטרטגיה. מצד שני, מצב הוא חלק מההקשר של האובייקט עצמו, ועם הזמן ההקשר של האובייקט עובר ממצב אחד לאחר.

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

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

  7. סדר מעברי המדינה מוגדר היטב בדפוס המדינה; אין דרישה כזו לדפוס האסטרטגיה. הלקוח חופשי לבחור בכל יישום של האסטרטגיה לפי בחירתו.

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

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

זה הכל על ההבדל בין דפוסי המדינה והאסטרטגיה בג'אווה . כפי שאמרתי, שניהם נראים דומים בשיעורים ובדיאגרמות UML שלהם, שניהם מספקים עקרונות פתוחים/סגורים ומכילים התנהגות. השתמש בתבנית האסטרטגיה כדי לכלול אלגוריתם או אסטרטגיה שנחשפים להקשר בזמן ריצה, אולי כפרמטר או אובייקט מורכב, והשתמש בתבנית ה-State כדי לשלוט במעברי מצב ב-Java. מקורי כאן
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION