В Стратегической модели разве мы не можем сделать каждую стратегию как функцию, но не как класс?

Позвоните getIntent().getData(), чтобы получить Uri , затем позвоните getQueryParameter("d"), чтобы получить значение d.

9
задан nopole 8 June 2009 в 09:36
поделиться

5 ответов

В простейших случаях вы можете заменить шаблоны стратегии указателем на функцию. Однако рассмотрим этот случай

class HourlyPayStrategy implements PayStrategy
{
    public int calculate()
    {
        int x = doComplexOperation1();
        int y = doComplexOperation2();

        return x + y;
    }

    private int doComplexOperation1()
    {
        // ...
    }

    private int doComplexOperation2()
    {
        // ...
    }
}

. Если бы мы просто дали простой указатель на функцию, все стало бы очень сложно, потому что вы больше не можете реорганизовать эту вещь (ну,

3
ответ дан 4 December 2019 в 20:24
поделиться

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

2
ответ дан 4 December 2019 в 20:24
поделиться

Зависит от языка. В C # вы можете сделать его делегатом. В Java это был бы анонимный класс. В C ++ вы действительно можете сделать его указателем на функцию.

4
ответ дан 4 December 2019 в 20:24
поделиться

В C # вы можете использовать делегаты с шаблоном стратегии. Взгляните на это сообщение в блоге для примера.

1
ответ дан 4 December 2019 в 20:24
поделиться

То, что происходит под капотом в большинстве реализаций C ++, - это почти то, что вы предлагаете. Компилятор обычно разрешает вызов Strategy.virtualMethod () следующим образом (в псевдокоде):

  (Strategy.pVtable[indexOfVirtualMethod])()

Итак, если ваша единственная забота - это еще одно разыменование указателя (pVtable), вам действительно следует сначала профилировать, если вы не можете определить более серьезные горячие точки. .

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

1
ответ дан 4 December 2019 в 20:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: