有人能告诉我一个使用方案的战略模式的简单例子吗?

时间:2011-05-28 13:38:55

标签: design-patterns scheme strategy-pattern

我是设计模式的新手,我正在努力学习策略模式。在这里和oodesign.com上阅读了一些例子之后,我对它的意图有了一个公平的理解。但是,我发现的大多数例子都是Java,C#或C / C ++;这些语言更有条理,迫使你有类等。谈到像计划这样的动态语言,我无法想象如何实现这种模式。有人能告诉我一个例子吗?

2 个答案:

答案 0 :(得分:9)

在Scheme和Racket中,战略模式是......等待......功能应用。

策略的维基百科页面提供了使用它的示例:

//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);
  }
}

在Scheme或Racket中,您只需将其写为:

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

而且,如果你想传递一个策略来应用于一组参数,它可能看起来像这样:

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

实际上,战略模式存在的唯一主要原因是Java类型系统的弱点。

答案 1 :(得分:3)

可以绘制一个更复杂的例子,尽管已经有很好的内置方法可以演示策略模式。这使用scheme的第一类函数实现策略模式:

(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)

我们处理/操纵相同的数据,尽管每次使用不同的策略。这是一个玩具示例,因此这里的策略选择不是很先进,尽管同样的道理可能是列表或各种查找表。