Заметки WEB-разработчика

Полезные материалы для web-разработки

ООП паттерн Стратегия (Strategy)

В этой статье приводится подробное и простое объяснение ооп паттерна Стратегия (Strategy) на примере языка php

Стратегия, Strategy — поведенческий шаблон проектирования, предназначенный для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путем определения соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют.

Применяется в случаях

В одном и том же случае, в зависимости от текущего состояния системы или её окружения, используются различные алгоритмы

Примечание

Важно понимать, что задачей Стратегии, в отличие, к примеру, от Фабрики, не вернуть объект, а совершить какие-то определенные действия в зависимости от условий.

Объяснение метафорой

Используется для выбора различных путей получения результата. Вспомним пример с получением прав. Человек, который будет реализовывать паттерн «стратегия» будет действовать следующим образом: вы говорите ему «Хочу права, денег мало» в ответ вы получите права через длительное время и с большой тратой ресурсов. Если вы скажите ему «Хочу права, денег много», то вы получите права очень быстро. Что именно делал этот человек вы понятия не имеете, но вы задаете начальные условия, а как себя вести уже решает он сам (сам выбирает стратегию).
Соответственно внутри «стратегии» хранятся различные способы поведения, и чтобы выбрать, ему нужны определенные параметры, в данном случае это объем денежных средств. Как устроена сама «стратегия» и какие алгоритмы внутри нее вам собственно знать и требуется.

Пример

Проблема. К примеру у нас есть интернет-магазин с поддержкой нескольких способов оплаты за товары. Так же способ оплаты должен автоматически определяться в зависимости от суммы товаров, набранных пользователем в корзину. Итак, если у нас в корзине товаров на сумму меньше $500, то оплата должна быть осуществлена через PayPal; если же боле $500 или более, то в этом случае оплата должна осуществиться через банковскую карту. Далее создадим код, который обеспечит нам работу двух намеченных стратегий: Для начала создадим два класса: один для оплаты через Paypal, второй через банковскую карту.

interface payStrategy {
    public function pay($amount);
}

class payByCC implements payStrategy {

    private $ccNum = '';
    private $ccType = '';
    private $cvvNum = '';
    private $ccExpMonth = '';
    private $ccExpYear = '';

    public function pay($amount = 0) {
        echo "Paying ". $amount. " using Credit Card";
    }

}

class payByPayPal implements payStrategy {

    private $payPalEmail = '';

    public function pay($amount = 0) {
        echo "Paying ". $amount. " using PayPal";
    }

}

class shoppingCart {

    public $amount = 0;

    public function __construct($amount = 0) {
        $this->amount = $amount;
    }

    public function getAmount() {
        return $this->amount;
    }

    public function setAmount($amount = 0) {
        $this->amount = $amount;
    }

    public function payAmount() {
        if($this->amount >= 500) {
            $payment = new payByCC();
        } else {
            $payment = new payByPayPal();
        }

        $payment->pay($this->amount);
    }
}

$cart = new shoppingCart(499);
$cart->payAmount();

// Вывод
//Paying 499 using PayPal

$cart = new shoppingCart(501);
$cart->payAmount();

//Вывод
//Paying 501 using Credit Card

Комментарии

Комментарии через Вконтакте