State Pattern
מכונת Vending. ארבעה מצבים: No Coin, Has Coin, Dispensing, Sold Out. כל לחיצה על כפתור עושה משהו שונה לחלוטין לפי המצב שבו המכונה נמצאת. לחצת "Dispense" כשאין מטבע? לא קורה כלום. הכנסת מטבע כשהמכונה ריקה? מחזירים אותו. זה נראה פשוט - עד שמנסים לממש את זה עם if (state === "hasCoin") על פני עשרה Methodים שונים. כל מצב חדש אומר לעבור על כל עשרת ה-Methods ולהוסיף Branch. שש חודשים אחר כך, הקוד לא ניתן לקריאה.
ה-State Pattern פותר בדיוק את זה - כל מצב הופך לאובייקט עצמאי עם הלוגיקה שלו. המכונה (ה-Context) מחזיקה Reference לאובייקט המצב הנוכחי ומעבירה אליו את כל הקריאות. מחר רוצים להוסיף מצב "Maintenance Mode"? כותבים Class אחד חדש, לא נוגעים בשאר.
הנקודה המבדילה את State Pattern מ-Strategy Pattern - שניהם עובדים על Delegation לObject חיצוני - היא הTransitions. ב-Strategy, הבוחר החיצוני מחליט מה ה-Strategy. ב-State, ה-State עצמה מחליטה לאן לעבור. PendingState.processPayment() קוראת context.setState(new ConfirmedState()) - המעבר אוטומטי, פנימי, ומנוהל על ידי ה-State עצמה. ה-Context לא צריך לדעת ש-"Pending + Payment = Confirmed."