Sobes.tech
Middle

Πώς υλοποιείτε το μοτίβο σχεδίασης 'Στρατηγική' σε PHP;

sobes.tech AI

Απάντηση από AI

Το πρότυπο Στρατηγική επιτρέπει την ενσωμάτωση διαφόρων αλγορίθμων σε ξεχωριστές κλάσεις και την αντικατάστασή τους κατά την εκτέλεση του προγράμματος. Ο κώδικας πελάτη εργάζεται με μια κοινή διεπαφή στρατηγικών, χωρίς να γνωρίζει την συγκεκριμένη υλοποίησή τους.

Η υλοποίηση σε PHP περιλαμβάνει:

  1. Διεπαφή Στρατηγικής: Ορίζει μια κοινή μέθοδο που θα υλοποιούν όλες οι συγκεκριμένες στρατηγικές.
  2. Συγκεκριμένες Στρατηγικές: Κλάσεις που υλοποιούν τη διεπαφή και περιέχουν τη συγκεκριμένη λογική του αλγορίθμου.
  3. Πλαίσιο: Κλάση που περιέχει μια αναφορά σε ένα αντικείμενο στρατηγικής και αναθέτει την εκτέλεση της μεθόδου σε αυτό το αντικείμενο.

Παράδειγμα:

// 1. Διεπαφή Στρατηγικής
interface SortStrategy
{
    public function sort(array $data): array;
}

// 2. Συγκεκριμένη Στρατηγική (ταξινόμηση με φυσαλίδα)
class BubbleSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        $n = count($data);
        for ($i = 0; $i < $n; $i++) {
            for ($j = 0; $j < $n - 1 - $i; $j++) {
                if ($data[$j] > $data[$j + 1]) {
                    $temp = $data[$j];
                    $data[$j] = $data[$j + 1];
                    $data[$j + 1] = $temp;
                }
            }
        }
        return $data;
    }
}

// 2. Συγκεκριμένη Στρατηγική (γρήγορη ταξινόμηση)
class QuickSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        // Απλή υλοποίηση για παράδειγμα, στην πραγματικότητα θα είναι αναδρομική
        sort($data); // Χρησιμοποιούμε ενσωματωμένη συνάρτηση για εικονογράφηση
        return $data;
    }
}

// 3. Πλαίσιο
class SortedList
{
    private SortStrategy $strategy;
    private array $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function setSortStrategy(SortStrategy $strategy): void
    {
        $this->strategy = $strategy;
    }

    public function sort(): array
    {
        if (!isset($this->strategy)) {
            throw new \RuntimeException("Δεν έχει οριστεί στρατηγική ταξινόμησης.");
        }
        return $this->strategy->sort($this->data);
    }
}

// Χρήση
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);

// Με ταξινόμηση φυσαλίδας
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);

// Με γρήγορη ταξινόμηση
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);

Πλεονεκτήματα:

  • Ευελιξία: Νέοι αλγόριθμοι ταξινόμησης μπορούν να προστεθούν εύκολα χωρίς να αλλάξει το πλαίσιο.
  • Επεκτασιμότητα: Νέες στρατηγικές μπορούν να υλοποιηθούν ανεξάρτητα.
  • Καθαρότητα κώδικα: Το πλαίσιο διαχωρίζεται από τη λογική των συγκεκριμένων αλγορίθμων.
  • Δοκιμαστικότητα: Κάθε στρατηγική μπορεί να δοκιμαστεί απομονωμένα.