Perl 中策略模式的干净实现
-
09-06-2019 - |
题
如何在 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
不隶属于 StackOverflow