在Perl中干净地实施策略模式

时间:2020-03-05 18:57:29  来源:igfitidea点击:

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

解决方案

回答

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

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

回答

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

回答

这实际上取决于我们所说的"干净的实现"。与其他任何语言一样,我们可以使用具有多态性的Perl对象系统为我们完成此任务。但是,由于Perl具有一流的功能,因此通常不会显式编码此模式。莱昂·蒂默曼斯(Leon Timmermans)的榜样

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

非常优雅地展示了这一点。

但是,如果要像在C ++中那样寻找"正式"实现,则使用Perl + Moose可能看起来像这样。这只是Wikipedia -Strategy模式的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();