Middle+
Ποια είναι η διαφορά μεταξύ των μοτίβων 'προσαρμογέα' και 'διακοσμητή';
sobes.tech AI
Απάντηση από AI
Προσαρμογέας μετατρέπει το interface μιας κλάσης στο interface που αναμένει μια άλλη κλάση, παρέχοντας συμβατότητα μεταξύ κλάσεων με ασυμβίβαστα interfaces. Αλλάζει την υπογραφή των υπαρχόντων μεθόδων ώστε να ταιριάζουν στο νέο interface.
Διακοσμητής προσθέτει δυναμικά νέες ευθύνες σε ένα αντικείμενο τυλίγοντάς το σε έναν διακοσμητή. Δεν αλλάζει το interface του διακοσμημένου αντικειμένου, απλώς επεκτείνει τη λειτουργικότητά του.
| Κριτήριο | Προσαρμογέας | Διακοσμητής |
|---|---|---|
| Στόχος | Συμβατότητα interfaces | Επέκταση λειτουργικότητας |
| Αλλαγή interface | Ναι, μετατρέπει το ένα σε άλλο | Όχι, διατηρεί το υπάρχον |
| Δομή | Τυλίγει το προσαρμοζόμενο αντικείμενο | Τυλίγει το διακοσμημένο αντικείμενο |
| Συμπεριφορά | Αλλάζει τις κλήσεις προς το προσαρμοζόμενο αντικείμενο | Προσθέτει νέες ενέργειες ή τροποποιεί τις υπάρχουσες |
| Παράδειγμα | Μετατροπή XML σε JSON | Προσθήκη καταγραφής σε μια υπάρχουσα κλάση |
<?php
// Παράδειγμα Προσαρμογέα
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Ειδικό αίτημα του Adaptee" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Μετατροπή της κλήσης
$this->adaptee->specificRequest();
}
}
// Παράδειγμα Διακοσμητή
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Λειτουργία του συγκεκριμένου συστατικού" . PHP_EOL;
}
}
class Decorator implements Component {
protected $component;
public function __construct(Component $component) {
$this->component = $component;
}
public function operation() {
$this->component->operation();
}
}
class ConcreteDecoratorA extends Decorator {
public function operation() {
parent::operation();
$this->addedBehaviorA();
}
private function addedBehaviorA() {
echo "Προστιθέμενη συμπεριφορά A" . PHP_EOL;
}
}