מבוא לתבניות עיצוב
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 64 מתוך 87.
תבניות עיצוב הן פתרונות מוכחים לבעיות נפוצות שמפתחים נתקלים בהן שוב ושוב בעת פיתוח תוכנה. במקום להמציא את הגלגל מחדש בכל פעם, אפשר ליישם את התבניות האלה, שנבחנו לאורך זמן, כדי לפתור אתגרי עיצוב חוזרים.
חשוב על דפוסי עיצוב כעל שרטוטים. הם לא מספקים לך קוד מוגמר שאפשר להעתיק ולהדביק, אלא מתארים כיצד לבנות את המחלקות והאובייקטים שלך כדי לפתור סוג מסוים של בעיה. הדפוסים שתלמד מנצלים את מושגי ה-OOP שכבר שלטת בהם: הורשה, ממשקים, פולימורפיזם והרכבה.
דפוסי עיצוב מתחלקים לשלוש קטגוריות עיקריות:
| קטגוריה | מטרה | דוגמאות |
|---|---|---|
| יצירה | כיצד יוצרים אובייקטים | Singleton, Factory, Builder |
| מבנה | כיצד מרכיבים אובייקטים | Adapter, Decorator, Composite |
| התנהגות | כיצד אובייקטים מתקשרים | Observer, Strategy, Command |
למה ללמוד תבניות עיצוב? הן מעניקות לך אוצר מילים משותף עם מפתחים אחרים: האמירה "השתמשו ב־Factory כאן" מעבירה מיד רעיון מורכב. הן גם עוזרות לך לכתוב קוד גמיש יותר וקל יותר לתחזוקה, באמצעות יישום עקרונות כמו "תכנתו לממשק, לא למימוש."
בשיעורים הבאים תממשו כמה תבניות חיוניות, החל בתבניות יצירה כמו Singleton ו־Factory, ואז תעברו לתבניות התנהגות כמו Observer ו־Strategy.
אתגר
קלנבנה מסווג תבניות פשוט שידגים את ההבנה שלך בשלוש הקטגוריות של תבניות עיצוב! תיצור מערכת שמסווגת תבניות ומסבירה את מטרתן, תוך ארגון הקוד שלך בכמה קבצים.
תיצור שלושה קבצים:
Pattern.java: צור ממשק בשםPatternשמגדיר את החוזה עבור כל תבניות העיצוב. על הממשק שלך להצהיר על שתי שיטות:String getCategory()שמחזירה את הקטגוריה של התבנית (Creational, Structural או Behavioral), ו-String getPurpose()שמחזירה תיאור של מה שעושה קטגוריית התבניות הזו.PatternInfo.java: צור שלוש מחלקות שמממשות את הממשקPatternשלך, שכל אחת מהן מייצגת קטגוריה אחת של תבניות עיצוב:CreationalPattern- צריכה להחזיר"Creational"עבור הקטגוריה ו-"How objects are created"עבור המטרה.StructuralPattern- צריכה להחזיר"Structural"עבור הקטגוריה ו-"How objects are composed"עבור המטרה.BehavioralPattern- צריכה להחזיר"Behavioral"עבור הקטגוריה ו-"How objects communicate"עבור המטרה.Main.java: חבר את מסווג התבניות שלך! תקבל קלט אחד: שם של תבנית (String), שיהיה אחד מהבאים:"Singleton","Factory","Adapter","Decorator","Observer"או"Strategy".בהתאם לקלט, צור את אובייקט התבנית המתאים:
"Singleton"ו-"Factory"הן תבניות Creational"Adapter"ו-"Decorator"הן תבניות Structural"Observer"ו-"Strategy"הן תבניות Behavioral
אחסן את אובייקט התבנית שלך במשתנה מסוג
Pattern(הממשק), כדי להדגים את עקרון התכנות באמצעות ממשק. לאחר מכן, הדפס את שלוש השורות הבאות:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
תקבל קלט אחד: שם של תבנית עיצוב (String).
האתגר הזה מחזק את התובנה המרכזית מהשיעור: תבניות עיצוב מאורגנות בקטגוריות בהתאם לבעיה שהן פותרות. באמצעות ממשק, תתרגל גם את העיקרון של "תכנות לממשק, לא למימוש" — מושג מרכזי שהופך את תבניות העיצוב לחזקות כל כך!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: הכריזו על משתנה מטיפוס Pattern (הממשק)
Pattern pattern = null;
// TODO: על סמך patternName, צרו את אובייקט התבנית המתאים:
// - "Singleton" ו-"Factory" הן תבניות יצירה
// - "Adapter" ו-"Decorator" הן תבניות מבניות
// - "Observer" ו-"Strategy" הן תבניות התנהגותיות
// TODO: הדפיסו את הפלט בפורמט הבא:
// תבנית: [שם התבנית שהוזן]
// קטגוריה: [הקטגוריה שמחזירה getCategory()]
// מטרה: [המטרה שמחזירה getPurpose()]
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)11תבניות עיצוב חלק 1
מבוא לתבניות עיצובתבנית Singletonתבנית Factoryתבנית Builderתבנית Observerתבנית Strategy3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין