如何在 Perl 中编写策略模式的干净实现?我想以一种利用 Perl 特性的方式来做这件事。
thaiyoshi
问问题
1112 次
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 回答