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

有帮助吗?

解决方案

这实际上取决于您所说的“干净的实施”是什么意思。与任何其他语言一样,您可以使用具有多态性的 Perl 对象系统来为您完成此操作。然而,由于 Perl 具有一流的函数,因此该模式通常不会显式编码。莱昂·蒂默曼斯的例子

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

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

但是,如果您正在寻找像在 C++ 中那样的“正式”实现,那么使用 Perl+ 可能会如下所示驼鹿. 。这只是 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();

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top