רשת אפאצ'י קומונס

1. הקדמה

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

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

2. תלות של Maven

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

 commons-chain commons-chain 1.2 

כדי לבדוק את הגרסה האחרונה של הספרייה הזו - עבור לכאן.

3. שרשרת לדוגמא

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

4. הקשר שרשרת

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

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

  • הסכום הכולל שיש למשוך
  • מספר 100 שטרות ערך
  • מספר 50 שטרות ערך
  • מספר עשרה שטרות
  • הסכום שנותר למשיכה

מצב זה מוגדר בכיתה:

מחלקה ציבורית AtmRequestContext מרחיב את ContextBase {int totalAmountToBeWithdrawn; int noOfHundredsDispensed; int noOfFiftiesDispensed; int noOfTensDispensed; int amountLeftToBeWithdrawn; // סטרים סטנדרטיים וגטרים}

5. פיקוד

ה פקודה לוקח את גontext כקלט ומעבד אותו.

אנו מיישמים כל אחד מהשלבים שהוזכרו לעיל כ- פקודה:

המחלקה הציבורית מיישמת את הפקודה HundredDenominationDispenser {@Override ביצוע בוליאני ציבורי (הקשר ההקשר) זורק חריגה {intamountLeftToBeWithdrawn = (int) context.get ("amountLeftToBeWithdrawn); if (amountLeftToBeWithdrawn> = 100) {context.put ); context.put ("amountLeftToBeWithdrawn", amountLeftToBeWithdrawn% 100);} להחזיר שקר;}} 

ה פקודהs עבור FiftyDenominationDispenser & TenDenominationDispenser דומים.

6. שרשרת

א שַׁרשֶׁרֶת הוא אוסף של פקודות שיש לבצע בסדר מוגדר. שֶׁלָנוּ שַׁרשֶׁרֶת יורכב מהאמור לעיל פקודהs וגם an AuditFilter בסופו של דבר:

מחלקה ציבורית AtmWithdrawalChain מרחיבה את ChainBase {public AtmWithdrawalChain () {super (); addCommand (חדש HundredDenominationDispenser ()); addCommand (FiftyDenominationDispenser חדש ()); addCommand (חדש TenDenominationDispenser ()); addCommand (AuditFilter חדש ()); }}

כאשר יש כאלה פקודה בתוך ה שַׁרשֶׁרֶת חוזר נכון, זה מכריח את שַׁרשֶׁרֶת לסיום.

7. סנן

פילטר הוא גם א פקודה אבל עם א postProcess שיטה הנקראת לאחר ביצוע ה- שַׁרשֶׁרֶת.

שֶׁלָנוּ לְסַנֵן ישלח התראה ללקוח ולבנק:

AuditFilter בכיתה ציבורית מיישם את המסנן {@Override post-process בוליאני ציבורי (הקשר הקשר, חריג חריג) {// שלח הודעה לבנק ולמשתמש להחזיר false; } @Override ביצוע בוליאני ציבורי (הקשר הקשר) זורק חריג {להחזיר שקר; }}

8. קטלוג שרשראות

זה אוסף של שרשראות ו פקודות עם שמותיהם ההגיוניים.

במקרה שלנו, שלנו קָטָלוֹג יכיל את AtmWithdrawalChain.

מחלקה ציבורית AtmCatalog מרחיב את CatalogBase {public AtmCatalog () {super (); addCommand ("atmWithdrawalChain", חדש AtmWithdrawalChain ()); }}

9. שימוש בשרשרת

בוא נראה כיצד נוכל להשתמש באמור לעיל שַׁרשֶׁרֶת לעבד בקשת משיכה. קודם ניצור a הֶקשֵׁר ואז להעביר את זה שַׁרשֶׁרֶת. ה שַׁרשֶׁרֶת יעבד את הֶקשֵׁר.

נכתוב מקרה מבחן כדי להדגים זאת AtmWithdrawalChain:

מחלקה ציבורית AtmChainTest {@Test public void givenInputsToContext_whenAppliedChain_thenExpectedContext () זורק חריג {Context context = AtmRequestContext חדש) (); context.put ("totalAmountToBeWithdrawn", 460); context.put ("amountLeftToBeWithdrawn", 460); קטלוג קטלוג = AtmCatalog חדש (); פקודה atmWithdrawalChain = catalog.getCommand ("atmWithdrawalChain"); atmWithdrawalChain.execute (הקשר); assertEquals (460, (int) context.get ("totalAmountToBeWithdrawn")); assertEquals (0, (int) context.get ("amountLeftToBeWithdrawn")); assertEquals (4, (int) context.get ("noOfHundredsDispensed")); assertEquals (1, (int) context.get ("noOfFiftiesDispensed")); assertEquals (1, (int) context.get ("noOfTensDispensed")); }}

10. מסקנה

במדריך זה חקרנו תרחיש מעשי באמצעות ספריית Apache Commons Chain של אפאצ'י - עליה תוכלו לקרוא עוד כאן.

וכמו תמיד, הקוד למאמר זה זמין באתר Github.