Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 24

Когда следует использовать декораторы?

24.08.2024, 13:45. Показов 1785. Ответов 20

Студворк — интернет-сервис помощи студентам
Когда следует использовать декораторы?
Когда надо динамически добавлять к объекту новые функциональные возможности. При этом данные возможности могут быть сняты с объекта.
ВОПРОС . А как их можно снять ? например такой пример.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class Program
{
    static void Main(string[] args)
    {
       
 
        Pizza pizza3 = new BulgerianPizza();
        pizza3 = new TomatoPizza(pizza3);
        pizza3 = new CheesePizza(pizza3);// болгарская пиццы с томатами и сыром
        Console.WriteLine("Название: {0}", pizza3.Name);
        Console.WriteLine("Цена: {0}", pizza3.GetCost());
 
        Console.ReadLine();
    }
}
 
abstract class Pizza
{
    public Pizza(string n)
    {
        this.Name = n;
    }
    public string Name {get; protected set;}
    public abstract int GetCost();
}
 
class ItalianPizza : Pizza
{
    public ItalianPizza() : base("Итальянская пицца")
    { }
    public override int GetCost()
    {
        return 10;
    }
}
class BulgerianPizza : Pizza
{
    public BulgerianPizza()
        : base("Болгарская пицца")
    { }
    public override int GetCost()
    {
        return 8;
    }
}
 
abstract class PizzaDecorator : Pizza
{
    protected Pizza pizza;
    public PizzaDecorator(string n, Pizza pizza) : base(n)
    {
        this.pizza = pizza;
    }
}
 
class TomatoPizza : PizzaDecorator
{
    public TomatoPizza(Pizza p) 
        : base(p.Name + ", с томатами", p)
    { }
 
    public override int GetCost()
    {
        return pizza.GetCost() + 3;
    }
}
 
class CheesePizza : PizzaDecorator
{
    public CheesePizza(Pizza p)
        : base(p.Name + ", с сыром", p)
    { }
 
    public override int GetCost()
    {
        return pizza.GetCost() + 5;
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.08.2024, 13:45
Ответы с готовыми решениями:

Когда следует использовать значимый тип, а когда ссылочный?
Почитал про значимые и ссылочные типы, ознакомился с отличиями между ними, как работают те и другие. Но хотел бы увидеть от...

Когда нужно использовать структуры, когда классы, а когда словарь?
Хеллоу. Не могу понять, когда, что, нужно использовать. Допустим мне нужно получить объект, который имеет список объектов. И...

Когда нужно использовать абстрактный класс а когда интерфейс
Я вроде бы и понимаю эту тему, но не до конца. Абстракция нужна для определения подтипов сущностей, для их классификации, а интерфейс для...

20
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
01.09.2024, 19:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nedel Посмотреть сообщение
Декоратор имеет альтернативное название — обёртка. Оно более точно описывает суть паттерна: вы помещаете целевой объект в другой объект-обёртку, который запускает базовое поведение объекта, а затем добавляет к результату что-то своё.
Ум--м-м....
А адаптер это не упаковка? А Фасад?


Чтобы понять нюансы, отличия, то нужно сравнивать с близкими (с теми с которыми часто путают): Декоратор (Wrapper), Proxy, Adapter, Facade. Без э того не получится понять.

То есть вопрос должен быть не "Почему в этом паттерне так?", а "Я вот так реализовал такую задачу - это ближе к этому паттерну или к этому?"

Добавлено через 1 минуту
Цитата Сообщение от nedel Посмотреть сообщение
https://refactoring.guru/ru/de... /decorator
В первом обзаце:
Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».
То есть это ОДНА из видов обёрток.

Добавлено через 3 минуты
Прокси:
C#
1
2
3
4
5
6
7
public partial class Point2D : INotifyPropertyChanged
{
    private Point point;
 
    public double X {get => point.X; set => {point.X = value; ....}}
    public double Y {get => point.Y; set => {point.Y = value; ....}}
}
Декоратор:
C#
1
2
3
4
5
6
7
8
9
10
11
public partial class Point2D : INotifyPropertyChanged
{
    private Point point;
 
    public double X {get => point.X; set => {point.X = value;  SetLength(); ....}}
    public double Y {get => point.Y; set => {point.Y = value;  SetLength();  ....}}
 
    private  double _l;
    public double Length { get => _l; private set => {_l = value; ....}}
    private void SetLength() => Length = Math.Sqrt(X*X + Y*Y);
}
Добавлено через 1 минуту
Адаптер:
C#
1
2
3
4
5
6
7
public partial class Point2D : INotifyPropertyChanged
{
    private Point point;
 
    public double A {get => point.X; set => {point.X = value; ....}}
    public double B {get => point.Y; set => {point.Y = value; ....}}
}
Добавлено через 14 минут
Немного сложнее конечно.
Требование к декоратору, это ещё чтобы их можно было последовательно применять.

Более правильно:
C#
1
2
3
4
5
6
public interface IPoint2D 
{
    double X {get; set;}
    double Y {get; set;}
 
}
C#
1
2
3
4
5
6
7
public partial class Point2D : IPoint2D, INotifyPropertyChanged
{
    private Point point;
 
    public double X {get => point.X; set => {point.X = value; ....}}
    public double Y {get => point.Y; set => {point.Y = value; ....}}
}
C#
1
2
3
4
5
6
7
8
9
10
11
public partial class Vector2D : IPoint2D, INotifyPropertyChanged
{
    private IPoint2D point;
 
    public double X {get => point.X; set => {point.X = value;  SetLength(); ....}}
    public double Y {get => point.Y; set => {point.Y = value;  SetLength();  ....}}
 
    private  double _l;
    public double Length { get => _l; private set => {_l = value; ....}}
    private void SetLength() => Length = Math.Sqrt(X*X + Y*Y);
}
C#
1
2
3
4
5
6
7
8
9
10
public partial class Point2DColor : IPoint2D, INotifyPropertyChanged
{
    private IPoint2D point;
 
    public double X {get => point.X; set => {point.X = value;  SetLength(); ....}}
    public double Y {get => point.Y; set => {point.Y = value;  SetLength();  ....}}
 
    private  Color _c;
    public Color Color { get => _c; set => {_c = value; ....}}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.09.2024, 19:08

Когда нужно использовать ссылку с out, а когда с ref
Не давно начал учить С# но не могу понять когда надо использовать оut или ref , я так понимаю что это ссылки как в С++. Единственно в чем...

Когда использовать ссылочные типы, а когда использовать типы значений?
Как это определить?

Когда использовать IEquatable<T>, а когда IStructuralEquatable?
Когда использовать IEquatable&lt;T&gt;, а когда IStructuralEquatable?

Когда использовать отношение, а когда ключи?
Подскажите правильно ли понимаю, чтобы получать родительские дочерние строки не обязательно создавать PK, FK достаточно создать отношение:...

Какой вид разделителя в именах каталогов следует использовать в директиве #include и почему?
1. Какой вид разделителя в именах каталогов следует использовать в директиве #include и почему?


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru