Шаблон декоратора, который заменяет поведение вместо добавления - PullRequest
0 голосов
/ 20 сентября 2019

Я прочитал много постов и понимаю, что шаблон декоратора должен добавить функциональность существующему объекту.Однако у меня есть сценарий, в котором одно поведение заменено, а не расширенно.Чтобы продемонстрировать, предположим, что у меня есть эти классы:

public interface IDoStuff {
    string DoStuff();
    string DoOtherStuff();
}

public class A : IDoStuff {
    public A(){}
    public string DoStuff() {
        ....
    }

    public string DoOtherStuff() {
        ....
    }
}


public class B : IDoStuff {
    protected readonly IDoStuff decoratee;

    public B(IDoStuff decoratee){ 
        this.decoratee = decoratee;
    }

    public string DoStuff() {
        decoratee.DoStuff();
        //More code
    }

    public string DoOtherStuff() {
        ....
        // This does not call decoratee.DoOtherStuff
    }
}

Хотя я украсил метод B.DoStuff, но его метод DoOtherStuff является совершенно другой реализацией и вообще не может повторно использовать базовый объект.

Правильно ли я его реализую?Или это совершенно другая модель?

1 Ответ

1 голос
/ 23 сентября 2019

Шаблон декоратора использует делегирование для реализации своих методов.В чистом варианте:

Декоратор перенаправляет запросы к компоненту и может выполнять дополнительные действия (например, рисование границы) до или после пересылки.(Design Patterns, GoF, 1997, Pattern Decorator )

Мы можем сделать вывод, что каждый метод декорированного класса должен использоваться декоратором, и добавляется новый метод.Кажется, вы используете не простой шаблон декоратора, а просто шаблон делегирования.Это очень часто встречается в реальном мире: вы создаете свое приложение с кусками различных шаблонов для достижения фиксированной цели.

Тем не менее, более важно придерживаться принципа замены Лискова : B.doStuff и B.doOtherStuff должны соблюдать контракт IDoStuff (я полагаю A.doStuff и A.doOtherStuff do), так что вы можете использовать экземпляр B вместо экземпляра A не нарушая логику вашей программы.(Это очень расплывчатая формулировка принципа подстановки Лискова, но этого должно быть достаточно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...