Чистая реализация шаблона стратегии в Perl - PullRequest
3 голосов
/ 17 сентября 2008

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

Ответы [ 3 ]

5 голосов
/ 17 сентября 2008

Это действительно зависит от того, что вы подразумеваете под «чистой реализацией». Как и в любом другом языке, вы можете использовать объектную систему 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();
4 голосов
/ 17 сентября 2008

Используйте суб ссылки и замыкания. Хороший хороший пример этого

sort { lc($a) cmp lc($b) } @items
3 голосов
/ 17 сентября 2008

Эта статья может быть полезна. Он охватывает пример использования шаблона стратегии в Perl. http://www.perl.com/pub/a/2003/08/07/design2.html

...