Как мне написать чистую реализацию шаблона стратегии на Perl? Я хочу сделать это так, чтобы использовать возможности Perl.





Используйте подссылки и замыкания. Хороший пример этого
sort { lc($a) cmp lc($b) } @items
Это действительно зависит от того, что вы подразумеваете под «чистой реализацией». Как и в любом другом языке, вы можете использовать объектную систему 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();