User Tools

Site Tools


oop:strategy_pattern

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
oop:strategy_pattern [2026/05/24 09:34] – created gthanosoop:strategy_pattern [2026/05/25 15:03] (current) – [Α. Προσέγγιση με Κληρονομικότητα] gthanos
Line 33: Line 33:
 </code> </code>
  
-===== Παράδειγμα e-shop =====+===== 1o Παράδειγμα - Shopping Cart με διαφορετικούς τρόπους πληρωμής =====
  
 Φανταστείτε ένα e-shop όπου ο χρήστης μπορεί να επιλέξει πώς θα πληρώσει: με Πιστωτική Κάρτα ή με PayPal. Αντί να γεμίσουμε τον κώδικα με if-else ή switch, χρησιμοποιούμε το Strategy Pattern. Αρχικά ορίζουμε ένα //interface// που περιγράφει τη μέθοδο ("στρατηγική") πληρωμής.  Φανταστείτε ένα e-shop όπου ο χρήστης μπορεί να επιλέξει πώς θα πληρώσει: με Πιστωτική Κάρτα ή με PayPal. Αντί να γεμίσουμε τον κώδικα με if-else ή switch, χρησιμοποιούμε το Strategy Pattern. Αρχικά ορίζουμε ένα //interface// που περιγράφει τη μέθοδο ("στρατηγική") πληρωμής. 
Line 146: Line 146:
  
  
 +===== 2ο Παράδειγμα: Σύστημα Χαρακτήρων Παιχνιδιού =====
  
 +Φανταστείτε ένα παιχνίδι με χαρακτήρες που χρησιμοποιούν όπλα. 
 +
 +==== Α. Προσέγγιση με Κληρονομικότητα ====
 +
 +Αν χρησιμοποιήσουμε κληρονομικότητα, θα έπρεπε να φτιάξουμε κλάσεις όπως ''WarriorWithSword'', ''WarriorWithBow'', ''KnightWithSword'' κ.λπ. Αν προσθέσουμε ένα νέο όπλο, πρέπει να φτιάξουμε δεκάδες νέες κλάσεις.
 +
 +<code java DifferentCharacters.java>
 +// Στατικό και δύσκαμπτο
 +class WarriorWithSword extends Character {
 +    void attack() { System.out.println("Attack using sword!"); }
 +}
 +
 +class WarriorWithBow extends Character {
 +    void attack() { System.out.println("Attack using bow!"); }
 +}
 +
 +class WarriorWithSpear extends Character {
 +    void attack() { System.out.println("Attack using long spear!"); }
 +</code>
 +
 +Ενώ έχουμε έχουμε δημιουργήσει πολλές κλάσεις, δεν έχουμε την δυνατότητα ένας πολλεμιστής να αλλάξει όπλο ή να προσθέσουμε όπλο. Είναι "κλειδωμένος" στην υλοποίηση της κλάσης του.
 +
 +==== Β. Προσέγγιση με 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("Attack with sword!"); }
 +}
 +
 +class BowBehavior implements WeaponBehavior {
 +    public void useWeapon() { System.out.println("Attack with bow!"); }
 +}
 +
 +// 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("The knight finds a bow!!!");
 +        arthurs.setWeapon(new BowBehavior());
 +        
 +        arthurs.performAttack(); // Επίθεση με Τόξο!
 +    }
 +}
 +</code>
  
  
  
  
oop/strategy_pattern.1779615271.txt.gz · Last modified: 2026/05/24 09:34 by gthanos