Featured
Категории
Тази статия бе написана на Friday, October 3rd, 2008 в 00:11 и е поставена в Програмиране, Uncategorized. Вие можете да оставите коментар, или да следите темата от вашия личен сайт.

Модел за програмиране “Декоратор” (Decorator design pattern)

Децоратор (Decorator) е модел за програмиране (Design pattern). Терминът “Декоратор” се използва в компютърната наука за обозначаване на специфичен модел за програмиране на обектно ориентирани програми, отнасящ се до поведението на обекти.

Това е метод за натграждане на вече съществуващи обекти и е ефектижен начин за осъществяване на модулност на структури с много нива на наследяване разклонения.

 Декоратор се състой е добавяне на функционалност на вече съществуващ обект. Например ако имате обект “Пица” и искате да го декорирате с някакъв сос например “Кетчуп”, може да създадете декоратор за всички пици които да се казва “Сос” който наследява обекта “Пица” и се наследява от “Кетчуп”. При това положение “Кетчуп” наследява основния обект “Пица” и всяка негова инстанция ще бъде от този обект.

Да видим как изглейда това в PHP:

Създаваме интерфейса на всички пици които ще предлагаме
interface pizza{
public function wait();
}

Създаваме примерна пица “pizzaItaliana”

class pizzaItaliana implements pizza{
private $tomatos;
private $meet;
private $cheese;
public function __construct($tomatos, $meet, $cheese){
$this->tomatos = $tomatos;
$this->cucumbers = $meet;
$this->cheese = $cheese;
}
public function wait(){
echo "The pizza is served using {$this->tomatos} tomatos, {$this->meet} meet and {$this->cheese} gr. of cheese.";
}
}

След това създаваме абстрактен декоратор, който да се имплементира от всичли възможни декорации на пицата.

abstract class pizzaDecorator implements pizza{
protected $pizza;
public function __construct(pizza $pizza){
$this->pizza=$pizza;
}
public function wait(){}
}

Следват действителните декоратори

class ketchup extends pizzaDecorator {
public function wait(){
$this->pizza->wait();
echo " Then it was decorated with some ketchup.";
}
}
class maionaise extends pizzaDecorator {
public function wait(){
$this->pizza->wait();
echo " Then it was decorated with some maionase.";
}
}

Използването на получената структура е много лесно
$order1 = new pizzaItaliana(2,1,100); // creates the salad in the normal maner
$order1 = new ketchup($order1); // add a decorator to the class
$order1->wait();

но тъй като не са нужни междинните инстанции може да направим това
$order3 = new ketchup(new maionaise(new pizzaItaliana(1,0.5,50)));
$order3->wait();

Този модел е много подходящ за модулиране на отделни елементи. Например ако искате да имате възможност да работите с фаилове като обекти, можете да създадете обект “file”, който да прочита от диска параметрите на реалния фаил и да определя неговия тип. След това можете да създадете “textFile” декоратор който да обслужва текстовите файлове. Той ще се наследява от реалните декоратори “planeTextFile” и “XMLTextFile”, както и “iniTextFile” които ще обслужват тези типове фаилове. Но най-добрата страна на този модел за програмиране е, че винаги можете да добавите друг декоратор за текстов файл или направо нов абстрактен декоратор с който да създавате и четете например PDF или XLS.
Работата със всеки абстрактен декоратор може да е различна тъй като различната функционалност се управлява различно, но Всеки път можете да добавяте такава без да променяте цялата си библиотека от функции.
В заключение ще отбележа значимостта на този модел при изграждане на frameworks (работни рамки) и предлаганото удобство за постоянното надграждане на една и съща рамка от различки програмисти.

Оставете коментар
:
:
: