Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 12.01.2009
Сообщений: 30

Гибкий Декоратор

21.06.2011, 01:08. Показов 1487. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Подскажите пожалуйста как сделать Декоратор гибким, чтобы динамически можно было не только добавлять, но и удалять функционал. Везде пишут что-то вроде: "... декоратор позволяет динамически добалять и удалять поведение к обьекту" , но во всех примерах показано только добавление, но не удаление. Покажите пожалуйста на моем простом примере:

Интерфейс IComponent
C#
1
2
3
4
5
    public interface ICar
    {
        string GetDescription();
        double CalculateCost();
    }
Класс, который будем декорировать. Component
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    public class Car : ICar
    {
        public string Make { get; private set; }
        public string Model { get; private set; }
        public int Year { get; private set; }
        public System.Drawing.Color Color { get; private set; }
 
        private double _price;
 
        public Car(double price, string make, string model, int year, System.Drawing.Color color)
        {
            Make = make;
            Model = model;
            Year = year;
            Color = color;
            _price = price;
        }
 
        public string GetDescription()
        {
            return  
                "Make: " + Make +
                "\nModel: " + Model +
                "\nYear: " + Year +
                "\nColor: " + Color;
        }
 
        public double CalculateCost()
        {
            return _price;
        }
    }
Decorator 1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public sealed class AcousticSystem : ICar
    {
        private ICar car;
        public string AcousticSystemName { get; private set; }
        public AcousticSystem(ICar c)
        {
            car = c;
            AcousticSystemName = "Pioneer A550";
        }
 
        public string GetDescription()
        {
            return car.GetDescription() + "\nAcoustic: " + AcousticSystemName;
        }
 
        public double CalculateCost()
        {
            return car.CalculateCost() + 850.00;
        }
    }
Decorator 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public class SportTransmission : ICar
    {
        ICar car;
        public SportTransmission(ICar c)
        {
            car = c;
            Transmission = "Sport PRO";
        }
 
        public string Transmission { get; private set; }
 
        public string GetDescription()
        {
            return car.GetDescription() + "\nTransmission: " + Transmission;
        }
 
        public double CalculateCost()
        {
            return car.CalculateCost() + 3000.00;
        }
    }
Decorator 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public class ClimateControl : ICar
    {
        ICar car;
        public ClimateControl(ICar c)
        {
            car = c;
            ClimateCtrl = "VIP Cooler 256";
        }
 
        public string ClimateCtrl { get; private set; }
 
        public string GetDescription()
        {
            return car.GetDescription() + "\nClimate Control: " + ClimateCtrl;
        }
 
        public double CalculateCost()
        {
            return car.CalculateCost() + 500.00;
        }
    }
Собственно нужна возможность динамически добвить например магнитолу и кондиционер, а затем убрать только магнитолу, кондиционер оставить и т.д. Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2011, 01:08
Ответы с готовыми решениями:

Декоратор(паттерн)
Привет, у меня есть вектор std::vector<cShape*> figures; помещаю в него 2 квадрата cShape* sq1 = new cSquare("sq1",...

Не совсем понял паттерн Декоратор
Недавно начал изучать паттерны. Не совсем понял паттерн "Декоратор". Паттерн предполает такую диаграмму классов Не совсем понял...

Гибкий Flyweight
Доброго времени! Почитав про Flyweight(приспособленец) понял что он мне подходит, но не полностью. В моей задаче неизвестно сколько полей...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.06.2011, 01:08
Помогаю со студенческими работами здесь

Декоратор
Не могу понять зачем использовать в декораторах from functool import wraps вот пример с @wraps и без wraps и работают одинаково. Для...

Декоратор
Хочу написать шнягу, чтобы выводилось время работы функции... решил сделать с помощью декоратора; не работает. Тогда попробовал написать...

Декоратор
function spy(func) { function wrapper(...args) { wrapper.calls.push(args); return func.apply(this, arguments); ...

Декоратор и MVC
Подскажите пожалуйста: Есть проект на MVC, есть модуль экспорта (экспортирует данные в виде таблице в разные формат: docx, pdf, html,...

Паттерн декоратор
Паттерн декоратор - это когда мы создаем производный класс от базового класса и внутри методов производного класса вызываем сначала методы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru