oop:strategy_pattern
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| oop:strategy_pattern [2026/05/24 09:34] – created gthanos | oop:strategy_pattern [2026/05/25 15:03] (current) – [Α. Προσέγγιση με Κληρονομικότητα] gthanos | ||
|---|---|---|---|
| Line 33: | Line 33: | ||
| </ | </ | ||
| - | ===== Παράδειγμα | + | ===== 1o Παράδειγμα - Shopping Cart με διαφορετικούς τρόπους πληρωμής |
| Φανταστείτε ένα e-shop όπου ο χρήστης μπορεί να επιλέξει πώς θα πληρώσει: | Φανταστείτε ένα e-shop όπου ο χρήστης μπορεί να επιλέξει πώς θα πληρώσει: | ||
| Line 146: | Line 146: | ||
| + | ===== 2ο Παράδειγμα: | ||
| + | Φανταστείτε ένα παιχνίδι με χαρακτήρες που χρησιμοποιούν όπλα. | ||
| + | |||
| + | ==== Α. Προσέγγιση με Κληρονομικότητα ==== | ||
| + | |||
| + | Αν χρησιμοποιήσουμε κληρονομικότητα, | ||
| + | |||
| + | <code java DifferentCharacters.java> | ||
| + | // Στατικό και δύσκαμπτο | ||
| + | class WarriorWithSword extends Character { | ||
| + | void attack() { System.out.println(" | ||
| + | } | ||
| + | |||
| + | class WarriorWithBow extends Character { | ||
| + | void attack() { System.out.println(" | ||
| + | } | ||
| + | |||
| + | class WarriorWithSpear extends Character { | ||
| + | void attack() { System.out.println(" | ||
| + | </ | ||
| + | |||
| + | Ενώ έχουμε έχουμε δημιουργήσει πολλές κλάσεις, | ||
| + | |||
| + | ==== Β. Προσέγγιση με Strategy Pattern | ||
| + | |||
| + | Εδώ, ο χαρακτήρας έχει ένα όπλο που υλοποιείται μέσω του Strategy Pattern, αλλά δεν είναι άρρικτα συνδεδεμένος με το όπλο του. Το όπλο μπορεί να αλλάξει στην εξέλιξη του παιχνιδιού. | ||
| + | |||
| + | <code java ActionGame.java> | ||
| + | // 1. Το Strategy Interface | ||
| + | interface WeaponBehavior { | ||
| + | void useWeapon(); | ||
| + | } | ||
| + | |||
| + | // 2. Concrete Strategies | ||
| + | class SwordBehavior implements WeaponBehavior { | ||
| + | public void useWeapon() { System.out.println(" | ||
| + | } | ||
| + | |||
| + | class BowBehavior implements WeaponBehavior { | ||
| + | public void useWeapon() { System.out.println(" | ||
| + | } | ||
| + | |||
| + | // 3. Το Context (Χαρακτήρας) | ||
| + | abstract class GameCharacter { | ||
| + | protected WeaponBehavior weapon; // Σύνθεση αντί για κληρονομικότητα | ||
| + | |||
| + | public void setWeapon(WeaponBehavior w) { | ||
| + | this.weapon = w; | ||
| + | } | ||
| + | |||
| + | public void attack() { | ||
| + | weapon.useWeapon(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | class Knight extends GameCharacter { | ||
| + | public Knight(WeaponBehavior) { | ||
| + | setWeapeon(WeaponBehavior); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // 4. Η διαφορά στην πράξη | ||
| + | public class ActionGame { | ||
| + | public static void main(String[] args) { | ||
| + | GameCharacter arthurs = new Knight(new SwordBehavior()); | ||
| + | | ||
| + | arthurs.performAttack(); | ||
| + | |||
| + | // ΑΛΛΑΓΗ ΣΥΜΠΕΡΙΦΟΡΑΣ at RUNTIME (Αδύνατο με κληρονομικότητα) | ||
| + | System.out.println(" | ||
| + | arthurs.setWeapon(new BowBehavior()); | ||
| + | | ||
| + | arthurs.performAttack(); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
oop/strategy_pattern.1779615271.txt.gz · Last modified: 2026/05/24 09:34 by gthanos
