3

我是设计模式的新手,我正在尝试学习策略模式。在阅读了此处和 oodesign.com 上的大量示例后,我对其意图有了一个公平的理解。但是,我发现的大多数示例都是用 Java、C# 或 C/C++ 编写的;这些语言更有条理,并迫使您上课等。当谈到像方案这样的动态语言时,我很难想象如何实现这种模式。有人可以给我举个例子吗?

4

2 回答 2

9

在 Scheme 和 Racket 中,策略模式是……等待它……函数应用。

Wikipedia page for strategy 给出了使用它的示例:

//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 类型系统的弱点。

于 2011-05-28T14:21:12.087 回答
3

可以绘制一个更复杂的示例,尽管该语言已经有很好的内置方法来演示策略模式。这使用方案的一流功能实现了策略模式:

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

我们处理/操作相同的数据,尽管每次都采用不同的策略。这是一个玩具示例,所以这里的策略选择不是很高级,尽管出于同样的原因,它可以是一个列表,或者某种查找表。

于 2011-05-28T13:57:00.393 回答