תבנית עיצוב מזכרת בג'אווה

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

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

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

2. מהו דפוס העיצוב של מזכרת?

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

מעשית, האובייקט שצריך לשמור על מצבו נקרא מקור. המטפל הוא האובייקט שמפעיל את השמירה והשבת המדינה, המכונה "מזכרת".

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

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

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

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

3. מתי להשתמש בתבנית עיצוב מזכרת?

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

4. דוגמה לתבנית המזכרת

4.1. מדגם ראשוני

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

מחלקה ציבורית TextEditor {private TextWindow textWindow; TextEditor ציבורי (TextWindow textWindow) {this.textWindow = textWindow; }}

יש לו חלון טקסט המכיל את הטקסט שהוזן כעת, ומספק דרך להוסיף טקסט נוסף:

מחלקה ציבורית TextWindow {Private StringBuilder currentText; TextWindow ציבורי () {this.currentText = חדש StringBuilder (); } addText public void (טקסט מחרוזת) {currentText.append (טקסט); }}

4.2. מַזכֶּרֶת

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

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

מחלקה ציבורית TextWindowState {טקסט מחרוזת פרטי; TextWindowState ציבורי (טקסט מחרוזת) {this.text = טקסט; } מחרוזת ציבורית getText () {טקסט חזרה; }}

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

4.3. יוֹזֵם

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

שמור TextWindowState ציבורי () {להחזיר TextWindowState חדש (wholeText.toString ()); } שחזור חלל ציבורי (שמירת TextWindowState) {currentText = StringBuilder חדש (save.getText ()); }

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

4.4. מַשׁגִיחַ

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

פרטי TextWindowState להציל את הטקסטWindow; בטל ציבורי hitSave () {savedTextWindow = textWindow.save (); } בטל פומבי hitUndo () {textWindow.restore (savedTextWindow); }

4.5. בודקים את הפתרון

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

TextEditor textEditor = חדש TextEditor (חדש TextWindow ()); textEditor.write ("דפוס עיצוב המזכרות \ n"); textEditor.write ("איך ליישם את זה ב- Java? \ n"); textEditor.hitSave (); textEditor.write ("קנו חלב וביצים לפני שאתם חוזרים הביתה \ n"); textEditor.hitUndo (); assertThat (textEditor.print ()). isEqualTo ("תבנית העיצוב המזכרת \ n כיצד ליישם אותה בג'אווה? \ n");

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

5. מסקנה

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

הקוד המלא המשמש במאמר זה ניתן למצוא באתר GitHub.


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