Может кто-нибудь показать мне простой пример схемы стратегии с использованием схемы? - PullRequest
3 голосов
/ 28 мая 2011

Я новичок в разработке шаблонов и пытаюсь изучить шаблон стратегии. Прочитав несколько примеров здесь и на oodesign.com, я понял, что он намерен делать. Тем не менее, большинство примеров, которые я нашел, находятся на Java, C # или C / C ++; эти языки более структурированы и заставляют вас иметь класс и тому подобное. Когда дело доходит до динамического языка, такого как схема, у меня возникают проблемы с представлением, как я могу реализовать такой шаблон. Может ли кто-нибудь показать мне пример?

Ответы [ 2 ]

9 голосов
/ 28 мая 2011

В Схеме и Ракетке шаблон стратегии ... ждать его ... применение функции.

На странице стратегии Википедии приведен пример ее использования:

//StrategyExample test application

class StrategyExample {

  public static void main(String[] args) {

      Context context;

      // Three contexts following different strategies
      context = new Context(new ConcreteStrategyAdd());
      int resultA = context.executeStrategy(3,4);

      context = new Context(new ConcreteStrategySubtract());
      int resultB = context.executeStrategy(3,4);

      context = new Context(new ConcreteStrategyMultiply());
      int resultC = context.executeStrategy(3,4);
  }
}

В Схеме или Ракетке вы просто напишите это как:

(+ 3 4)
(- 3 4)
(* 3 4)

И, если вы хотите передать стратегию, которая будет применена к набору аргументов, она может выглядеть следующим образом:

#lang racket
(define (apply-strategy strategy context)
  (strategy context))

Действительно, единственной основной причиной существования паттерна Стратегия является слабость системы типов Java.

3 голосов
/ 28 мая 2011

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

(define (calculate-bonuses lst double?)
   (define (triple x) (* x 3))
   (define (double x) (* x 2))

   (map (if double? double triple) lst))

(calculate-bonuses '(1200 3250 4000 890) #t)
(calculate-bonuses '(1200 3250 4000 890) #f)

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

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