2008-09-16 31 views

回答

5

這實際上取決於你的意思是「乾淨的實施」。和其他語言一樣,你可以使用Perl的多態對象系統爲你做這件事。但是,由於Perl具有第一類函數,因此通常不會顯式編碼此模式。萊昂Timmermans的例子

sort { lc($a) cmp lc($b) } @items 

演示這相當優雅。但是,如果您正在尋找一種「正式」實現,就像您在C++中所做的一樣,那麼使用Perl + Moose可能會看起來像這樣。這只是從Wikipedia -- Strategy pattern的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

使用子引用和閉包。這是一個很好的例子

sort { lc($a) cmp lc($b) } @items