3

如何在 Perl 中编写策略模式的干净实现?我想以一种利用 Perl 特性的方式来做这件事。

4

2 回答 2

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();
于 2008-09-17T14:17:36.333 回答
4

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

sort { lc($a) cmp lc($b) } @items
于 2008-09-16T23:21:53.973 回答