Sobes.tech
Middle+

რა განსხვავებაა 'ადაპტერის' და 'დეკორატორის' ნიმუშებს შორის?

sobes.tech AI

პასუხი AI-სგან

Адаптер бір кластың интерфейсін басқа кластың күтетін интерфейсіне айналдырып, сыныптар арасындағы үйлесімділікті қамтамасыз етеді. Бар әдістердің қолтаңбасын жаңа интерфейске сәйкестендіреді.

Декоратор объектке динамикалық түрде жаңа міндеттер қосады, оны декоратормен орайды. Декорирленген объектінің интерфейсін өзгертпей, оның функционалдығын кеңейтеді.

Критерий Адаптер Декоратор
Мақсат Интерфейстердің үйлесімділігі Функционалдылықты кеңейту
Интерфейстің өзгеруі Иә, бірін басқаға айналдырады Жоқ, барын сақтайды
Құрылым Өзгертілетін объектіні орайды Декорирленген объектіні орайды
Поведінка Шақыруларды өзгерту Жаңа әрекеттер қосу немесе барларын өзгерту
Мысал 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;
    }
}