Bridgeパターン

Mooseを用いたデザインパターンの勉強をしています。
牧大輔さんの「モダンPerl入門」を参考に、考え方をすこしずつ理解していきたいです。
現場でMooseを直接使ってはいないのですが、
いつか効率的なコードを書くのに生かせることができればと思います。


あまり目新しいことは書けないのですが、
自分の理解した内容を確認する意味でエントリーしました。


最初はBridgeパターン。
機能を示すクラスと、実際に実装を行うクラスを分割し、
Moose::Roleを持った抽象クラスが、機能クラスと実装クラスの
架け橋的な役割をしています。

use strict;
use warnings;

package CalculateImpl;
use Moose::Role;
requires qw( calculate_num );
no Moose::Role;
1;


# 足し算クラス
package Calculate::Addition;
use Moose;
with 'CalculateImpl';

__PACKAGE__->meta->make_immutable;

no Moose;
sub calculate_num {
my ( $self, $num ) = @_;
return $num + $num;
}
1;


# 掛け算クラス
package Calculate::Multiplication;
use Moose;
with 'CalculateImpl';

__PACKAGE__->meta->make_immutable;

no Moose;
sub calculate_num {
my ( $self, $num ) = @_;
return $num * $num;
}
1;


package Calculate;
use Moose;

has 'handle' => (
is => 'rw',
does => 'CalculateImpl',
required => 1,
handles => [ qw( calculate_num ) ]
);

__PACKAGE__->meta->make_immutable;

use Moose;
1;

package main;
use strict;
my $add = Calculate->new( handle => Calculate::Addition->new());
my $multi = Calculate->new( handle => Calculate::Multiplication->new());

$add->calculate_num( 50 );
$multi->calculate_num( 50 );
1;



計算という機能を意味するCalculateクラスのほかに、
実際に計算処理を実装する、
足し算クラスのCalculate::Additionクラスと
掛け算クラスのCalculate::Multiplicationクラスが存在します。
そして、機能クラスと実装クラスをつなぐ役割として、
CalculateImplクラスが存在します。


このような構成をすることで、何か変更が発生した場合は、
実装クラスを直接修正すればよいので、
機能クラスであるCalculateクラスを触る必要はありません。


勘違いをしてしまっている場合はご指摘いただければ助かります。