在Perl中清理策略模式的实现

时间:2008-09-16 23:17:06

标签: perl design-patterns strategy-pattern

如何在Perl中编写战略模式的干净实现?我想以一种利用Perl功能的方式来实现它。

3 个答案:

答案 0 :(得分:5)

这实际上取决于“清洁实施”的含义。与任何其他语言一样,您可以使用具有多态性的Perl对象系统为您执行此操作。但是,由于Perl具有第一类函数,因此通常不会显式编码此模式。

的Leon Timmermans的例子
sort { lc($a) cmp lc($b) } @items

非常优雅地证明了这一点。

但是,如果您正在寻找像C ++中那样的“正式”实现,那么使用Perl + Moose可能就像这样。这只是Wikipedia -- Strategy pattern的C ++代码的翻译,除了我使用Moose对委托的支持。

package StrategyInterface;
use Moose::Role;
requires 'run';


package Context;
use Moose;
has 'strategy' => (
  is      => 'rw',
  isa     => 'StrategyInterface',
  handles => [ 'run' ],
);


package SomeStrategy;
use Moose;
with 'StrategyInterface';
sub run { warn "applying SomeStrategy!\n"; }


package AnotherStrategy;
use Moose;
with 'StrategyInterface';
sub run { warn "applying AnotherStrategy!\n"; }


###############
package main;
my $contextOne = Context->new(
  strategy => SomeStrategy->new()
);

my $contextTwo = Context->new(
  strategy => AnotherStrategy->new()
);

$contextOne->run();
$contextTwo->run();

答案 1 :(得分:4)

使用子引用和闭包。这是一个很好的例子

sort { lc($a) cmp lc($b) } @items

答案 2 :(得分:3)

这篇文章可能有些用处。它涵盖了在Perl中使用策略模式的示例。 http://www.perl.com/pub/a/2003/08/07/design2.html