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