2008-09-16 12 views

答えて

5

本当に「クリーンな実装」ということにかかっています。他の言語と同様に、Perlの多態性を持つオブジェクトシステムを使用して、これを行うことができます。しかし、Perlはファーストクラスの関数を持っているので、このパターンは通常は明示的にはコード化されません。

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

のレオンTimmermans'の例は非常にエレガントにこれを示しています。

しかし、C++のように "正式な"実装を探しているのなら、Perl + Mooseを使ってみるとよいでしょう。これは、Mooseの委任のサポートを使用していることを除いて、Wikipedia -- Strategy patternのC++コードの翻訳です。

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 
関連する問題