Вопрос

Как мне написать чистую реализацию шаблона стратегии на 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top