Adapter(委譲を使う)

use strict;
use warnings;

{
    package Abstract::Print;
    use strict;
    use warnings;
    sub printWeak { die ""; }
    sub printStrong { die ""; }
}

{
    package PrintBanner;
    use strict;
    use warnings;
    use Data::Dumper;
    our @ISA = qw/Abstract::Print/;
    sub new {
        my ($class, $string) = @_;
        my $self = {
            banner => Banner->new($string),
        };
        return bless $self, $class;
    }
    sub printWeak {
        $_[0]->{banner}->showWithParen();
    }
    sub printStrong {
        $_[0]->{banner}->showWithAster();
    }
}

{
    package Banner;
    use strict;
    use warnings;
    sub new {
        my ($class, $string) = @_;
        my $self = {
            string => $string,
        };
        return bless $self, $class;
    }
    sub showWithParen {
        print "(".$_[0]->{string}.")";
    }
    sub showWithAster {
        print "*".$_[0]->{string}."*";
    }
}

my $p = PrintBanner->new('hogemoge');
$p->printWeak();
$p->printStrong();