Ошибка в декораторе

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.

Ошибка в декораторе

Сообщение Agiliter » 02 апр 2014, 14:44

Добрый день!
Пробую разобраться в паттерне Декоратор. В качестве примера программа. Есть класс напитков. У каждого напитка есть описание и цена.
  1. package  
  2. {   
  3.      public class BeverageBase
  4.      {
  5.         public var _description:String = ""; // Описание напитка
  6.        
  7.         public function BeverageBase(){}
  8.        
  9.         public function getDescription():String
  10.         {
  11.             return _description;
  12.         }
  13.        
  14.         public function getCost():int
  15.         {
  16.             return 1;
  17.         }
  18.      }
  19. }

От него наследуют эспрессо, черный чай и т.д.
  1. package  
  2. {
  3.     public class Espresso extends BeverageBase
  4.     {      
  5.         public function Espresso()
  6.         {
  7.             _description = "Espresso";
  8.         }
  9.        
  10.         public override function getCost():int
  11.         {
  12.              return 250;
  13.         }
  14.     }
  15. }

Создан класс добавок. Он наследует от напитков, чтобы можно было оперировать типами в дальнейшем.
  1. package  
  2. {
  3.     public class CondimentsDecoratorBase extends BeverageBase
  4.     {      
  5.         public function CondimentsDecoratorBase() {}       
  6.     }
  7. }

Теперь добавляем класс Молоко
  1. package  
  2. {
  3.     public class MilkCondiment extends CondimentsDecoratorBase
  4.     {
  5.         public var _beverage:BeverageBase;
  6.        
  7.         public function MilkCondiment(beverage:BeverageBase)
  8.         {
  9.             _beverage = beverage;          
  10.             _description = _beverage.getDescription + " Milk.";
  11.         }
  12.        
  13.         public override function getCost():int
  14.         {
  15.             return _beverage.getCost + 60;
  16.         }      
  17.     }
  18. }

Хотим создать эспрессо с молоком. В main пишем
  1. var _cappuccino:BeverageBase = new MilkCondiment(new Espresso());
  2. trace("Beverage: " + _cappuccino.getDescription() + " Cost: " + _cappuccino.getCost());


Трейсами выдает:
Beverage: function Function() {} Milk Cost: 0

Хотя должен по идее:
Beverage: Espresso. Milk. Cost: 310
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Re: Ошибка в декораторе

Сообщение alexandr_ratush » 02 апр 2014, 16:29

У вас неправильный вызов методов в классе MilkCondiment, нету скобок.
Вот так нужно:
  1.  
  2. ...
  3.  _description = _beverage.getDescription() + " Milk.";
  4. ...
  5. return _beverage.getCost() + 60;
  6. ...
  7.  

За это сообщение автора alexandr_ratush поблагодарил:
Agiliter
Аватара пользователя
alexandr_ratush

 
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47
Откуда: Ukraine
Благодарил (а): 2 раз.
Поблагодарили: 25 раз.

Re: Ошибка в декораторе

Сообщение Agiliter » 02 апр 2014, 17:28

Спасибо) Сгораю от стыда :)
Так-то декоратор верно реализовал? Если я захочу теперь эспрессо с сахаром молоком, то
  1. var _cappuccino:BeverageBase = new SugarCondiment(new MilkCondiment(new Espresso()));

И вуаля
Beverage: Espresso. Milk. Sugar. Cost: 370

Однако ж, насколько далеко можно зайти в этаком построении матрешек? Если с молоком, шоколадом, двойным сахаром и фиг знает еще с чем:
Beverage: Espresso. Milk. Chocolate. Sugar. Sugar. Cost: 490

то городить конструкцию вида
  1. var _cappuccino:BeverageBase = new SugarCondiment(new SugarCondiment(new ChocolateCondiment(new MilkCondiment(new Espresso()))));

???
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Re: Ошибка в декораторе

Сообщение alexandr_ratush » 02 апр 2014, 18:41

Я думаю что если у вас есть кнопка "Кофе с двойным сахаром, с шоколадом, с молоком и еспресо",то конструкция норм. :D

Как я бы сделал? При нажатии на кнопку "Получить кофе", пройтись по всем нажатым кнопкам, и сделать себе кофе:
  1.  
  2. private function getOptions():void
  3. {
  4.     // Название нажатой кнопки
  5.     var tracker: String;
  6.     // Проверяем все кнопки
  7.     for (var t: uint = 0; t < checks.length; t++)
  8.     {
  9.         if (checks[t].selected)
  10.         {
  11.             tracker = checks[t].label;
  12.             // По имени нажатой кнопки, декорируем наше кофе
  13.             switch (tracker)
  14.             {
  15.                 case "Sugar":
  16.                     coffe = new SugarCondiment(coffe);
  17.                 break;
  18.                 case "Chocolate":
  19.                     coffe = new ChocolateCondiment(coffe);
  20.                 break;
  21.                 case "Milk":
  22.                     coffe = new MilkCondiment(coffe);
  23.                 break;
  24.                 case "Espresso":
  25.                     coffe = new Espresso(coffe);
  26.                 break;
  27.             }
  28.         }
  29.     }
  30. }
  31.  


P.S.: Пример переделан из той же книги, где декорируют авто.
Аватара пользователя
alexandr_ratush

 
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47
Откуда: Ukraine
Благодарил (а): 2 раз.
Поблагодарили: 25 раз.

Re: Ошибка в декораторе

Сообщение Agiliter » 02 апр 2014, 20:12

alexandr_ratush писал(а):P.S.: Пример переделан из той же книги, где декорируют авто.


Ссылку на книгу можно? :)
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Re: Ошибка в декораторе

Сообщение alexandr_ratush » 02 апр 2014, 20:59

ActionScript 3.0 Design Patterns Можно найти в русском варианте.
Аватара пользователя
alexandr_ratush

 
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47
Откуда: Ukraine
Благодарил (а): 2 раз.
Поблагодарили: 25 раз.


Вернуться в Программирование на Flash



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1