<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1248856092595947833</id><updated>2012-02-15T23:50:59.931-08:00</updated><category term='HTML::Template::Pro HTML::CTPP2'/><title type='text'>Design Patterns In Perl</title><subtitle type='html'>The choice of implementation language affects the use of design patterns.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://design-patterns-perl.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1248856092595947833/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://design-patterns-perl.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Шогин Михаил</name><uri>http://www.blogger.com/profile/14369966185004546420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://2.bp.blogspot.com/_z78QvFOum_E/SeoKvhcv2mI/AAAAAAAAAAM/dpIpt6-GnvE/S220/joni.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1248856092595947833.post-2990787939620163618</id><published>2009-08-20T11:51:00.000-07:00</published><updated>2009-09-29T08:56:50.671-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML::Template::Pro HTML::CTPP2'/><title type='text'>Паттерн Adapter</title><content type='html'>Да, собрался с силами и нашел время, чтобы написать, а скорее самому разобраться, с этим паттерном.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Adapter&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Применяется (кратко):&lt;br /&gt;&lt;ul&gt;&lt;li&gt; изменение интерфейса существующего класса&lt;br /&gt;&lt;/li&gt;&lt;li&gt;объединение интерфейсов нескольких классов&lt;/li&gt;&lt;/ul&gt;За более подробной информацией идем &lt;a href="http://www.codelab.ru/pattern/adapter/"&gt;сюда&lt;/a&gt;. Мне интересна только реализация с использование Perl.&lt;br /&gt;&lt;br /&gt;Задача:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Что есть:&lt;/span&gt; реализуется простой, быстрый web-framework.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Что требуется:&lt;/span&gt; возможность быстрой замены шаблонизатора.&lt;br /&gt;По умолчанию используем &lt;a href="http://search.cpan.org/search?query=HTML%3A%3ATemplate%3A%3APro&amp;amp;mode=all"&gt;HTML::Template::Pro&lt;/a&gt;, но в будующем надеемся перейти на &lt;a href="http://search.cpan.org/search?query=HTML%3A%3ACTPP2&amp;amp;mode=all"&gt;HTML::CTPP2&lt;/a&gt;, либо что-нибудь еще более быстрое ))&lt;br /&gt;&lt;br /&gt;К сожалению в Perl нет интерфейсов, хотя можно сделать, что то вроде абстрактного класса (зачем?? :) ). Из этого следует что Class Adapter нам точно не подходит. Поэтому быстро и просто сделать Object Adapter (лучше всегда двигаться по пути наименьшего сопротивления).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Что получили&lt;/span&gt; (адаптируем HTML::Template::Pro):&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic; font-size:120%; color:#000000"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package HTMLTemplateProTemplate;&lt;br /&gt;use strict;&lt;br /&gt;&lt;br /&gt;use HTML::Template::Pro;&lt;br /&gt;use File::Spec;&lt;br /&gt;&lt;br /&gt;sub new&lt;br /&gt;{&lt;br /&gt;    my $class = shift;&lt;br /&gt;&lt;br /&gt;    return bless {&lt;br /&gt;        tmpl =&gt; new HTML::Template::Pro(filename =&gt; ''),&lt;br /&gt;        cache =&gt; {},&lt;br /&gt;    }, $class;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub set_path&lt;br /&gt;{&lt;br /&gt;    my ($self, $path) = @_;&lt;br /&gt;&lt;br /&gt;    $self-&gt;{tmpl}-&gt;{path} = $path;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub get&lt;br /&gt;{&lt;br /&gt;    my ($self, $tmplname) = @_;&lt;br /&gt;&lt;br /&gt;    return undef unless $self-&gt;_find_template($tmplname);&lt;br /&gt;&lt;br /&gt;    $self-&gt;{tmpl}-&gt;{filename} = $tmplname;&lt;br /&gt;&lt;br /&gt;    return $self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub _find_template&lt;br /&gt;{&lt;br /&gt;    my ($self, $tmplname) = @_;&lt;br /&gt;&lt;br /&gt;    return $self-&gt;{cache}{$tmplname} &lt;br /&gt;        if defined $self-&gt;{cache}{$tmplname};&lt;br /&gt;&lt;br /&gt;    for my $dir ( @{$self-&gt;{tmpl}-&gt;{path}} ){&lt;br /&gt;        my $fname = File::Spec-&gt;catfile($dir, $tmplname);&lt;br /&gt;        if (-e $fname){&lt;br /&gt;            $self-&gt;{cache}{$tmplname} = $fname;&lt;br /&gt;            return $fname;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return undef;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;1;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Клиет для этого класса:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold; font-size:120%; color:#000000"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package Template;&lt;br /&gt;use HTMLTemplateProTemplate;&lt;br /&gt;use Moose;&lt;br /&gt;&lt;br /&gt;has path    =&gt; ( is =&gt; 'ro', default =&gt; sub { [] } );&lt;br /&gt;has engine =&gt; ( is =&gt; 'ro' );&lt;br /&gt;&lt;br /&gt;sub new&lt;br /&gt;{&lt;br /&gt;    my $class = shift;&lt;br /&gt;&lt;br /&gt;    my $self = bless { @_ }, $class;&lt;br /&gt;&lt;br /&gt;    $self-&gt;_init;&lt;br /&gt;&lt;br /&gt;    return $self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub _init&lt;br /&gt;{&lt;br /&gt;    my $self = shift;&lt;br /&gt;&lt;br /&gt;    $self-&gt;{engine} = new HTMLTemplateProTemplate() &lt;br /&gt;                          unless $self-&gt;{engine};&lt;br /&gt;&lt;br /&gt;    $self-&gt;{engine}-&gt;set_path( $self-&gt;path );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub get&lt;br /&gt;{&lt;br /&gt;    my ( $self, $tmplname) = @_;&lt;br /&gt;&lt;br /&gt;    $self-&gt;{engine}-&gt;get($tmplname);&lt;br /&gt;&lt;br /&gt;    return $self-&gt;{engine};&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub render&lt;br /&gt;{&lt;br /&gt;    my ( $self, $context ) = shift;&lt;br /&gt;&lt;br /&gt;    return $self-&gt;{tmpl}-&gt;render($context);&lt;br /&gt;}&lt;br /&gt;1;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Когда мы решим использовать HTML::CTPP2 мы адаптируем его для нашего клиента и будем счастливы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1248856092595947833-2990787939620163618?l=design-patterns-perl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://design-patterns-perl.blogspot.com/feeds/2990787939620163618/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://design-patterns-perl.blogspot.com/2009/08/adapter.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1248856092595947833/posts/default/2990787939620163618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1248856092595947833/posts/default/2990787939620163618'/><link rel='alternate' type='text/html' href='http://design-patterns-perl.blogspot.com/2009/08/adapter.html' title='Паттерн Adapter'/><author><name>Шогин Михаил</name><uri>http://www.blogger.com/profile/14369966185004546420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://2.bp.blogspot.com/_z78QvFOum_E/SeoKvhcv2mI/AAAAAAAAAAM/dpIpt6-GnvE/S220/joni.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1248856092595947833.post-6297771923722592189</id><published>2009-04-24T15:48:00.000-07:00</published><updated>2009-04-26T16:15:22.486-07:00</updated><title type='text'>Singlton and Monostate</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Singlton&lt;/span&gt;&lt;/span&gt;&lt;div&gt;Позволяет создавать один экземпляр класса, и использовать его на протяжении всей жизни процесса.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Обычная мотивация применения паттерна&lt;a href="http://www.blogger.com/post-edit.g?blogID=1248856092595947833&amp;amp;postID=6297771923722592189#first"&gt;*&lt;/a&gt; :&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Необходимость - иметь один объект выполняющий однотипные действия (например Logger, Config)&lt;/li&gt;&lt;li&gt;Требование - должен быть один обьект, обычно контролирующий/обрабатывающий запросы (например Module)&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;Monostate&lt;br /&gt;&lt;/span&gt;&lt;div&gt;Дает такое же поведение что и синглтон, но не требует единичного экземпляра.&lt;/div&gt;&lt;div&gt;"Не один экземпляр, а одно состояние множества экземпляров".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Рассмотрим следующую ситуацию.&lt;/div&gt;&lt;div&gt;На сайт зашел пользователь. Есть два варианта &lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;он авторизован &lt;/li&gt;&lt;li&gt;он не авторизован&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Нам от него необходимо знать откуда он (регион). В первом случае мы можем посмотреть это в базе (т.к. всю возможную информацию о пользователе мы сохраняем), во втором случае у нас есть только ip.  Далее предположим, что мы можем запросить один из наших проектов опредилить регион пользователя по ip, партнерский проект отдает нам ID региона. У нас есть таблица соответствия ID_региона_партнера =&gt; ID_региона_в_нашей_базе. &lt;/div&gt;&lt;div&gt;Зачем нам все это? У нас имеются объявления, которые необходимо показывать пользователям. Обьявления имеют свой гео-таргетинг. Таким образом, для того что бы показать обьявление, нам необходимо знать из какого региона пользователь.&lt;/div&gt;&lt;div&gt;Можно спросить, "Что стоит сделать небольшой запрос к БД?", что бы получить ID региона в нашей базе, по имеющемуся ID партнера. Да, проблем нет, данныйй запрос выполнится максимально быстро, стоимость этого запроса минимальна, поиск идет по уникальному индексу. Но есть одно "но", на проекте количество запросов к основному бэкенду 10-20 в секунду. И что, получается будем дергать базу 10 раз в секунду? Конечно же нет. Мы все это сдампим один раз и потом будем отдавать из памяти.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Другой пример. При использовании mod_perl, при инициализации сессии, мы получаем ссылку на объект Apache::Request. Мы можем все время пробрасывать ссылку на этот объект в вызываемые методы, а можем сохранить ее и использовать сохраненную ссылку.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Покажем как это будет выглядеть:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Singlton&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;package Region;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;use strict;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;use warnings;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;my $_self = undef;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub new&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;my $class = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;if ( ref $_self ) {&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;return $_self;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;$_self = bless {}, $class;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return $_self-&gt;_init();&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;#инициализация хеша регионов&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub _init&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;my $self = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;$self = new($self) if !ref $self;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#инициируем хеш регионов&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#обращаемся к базе за списком (либо как-нибудь еще)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;my $st = $dbh-&gt;prepare("&lt;sql);&gt;&lt;/sql);&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;begin&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;:cr := region.getRegions;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;");&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;$st-&gt;bind_param_inout(':cr', \$cr, 0, {ora_type =&gt; ORA_RSET});&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;$st-&gt;execute;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;$st = $cr-&gt;fetchall_arrayref({}); $cr-&gt;finish; $cr = $st;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;for (@$cr) {&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$self-&gt;{$_-&gt;{PID}} = $_-&gt;{OID};&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return $self;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;#получение региона&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub get&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;my $self = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;my $id = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;$self = new($self) if !ref $self;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return $self-&gt;{$id};&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Monostate&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;package ApacheRequest;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;use strict;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;use warnings;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;my $AR= undef;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub new&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;        my $class = shift;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;        my $self = bless [], $class;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;        return $self;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;sub set&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;        my $self = shift;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;        my $requestHandle = shift;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;        $AR = $requestHandle;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub get&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;        my $self = shift;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;        return $AR;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Производительность обоих объектов соизмеримо равна. Так что, если вы реши использовать у себя в проекте один из этих паттрнов, то можете выбирать что больше нравится.&lt;/div&gt;&lt;div&gt;Я пользуюсь правилом&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;singlton - если необходимо кеширование&lt;/li&gt;&lt;li&gt;monostate - если уж очень сильно нужны глобальные объекты&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Паттерны дают нам готовые решения, но от того как вы их будете использовать, зависит судьба вашего проекта. &lt;/div&gt;&lt;/div&gt;&lt;div&gt;В примере с Monostate создается глобальная переменная, вследствии чего увеличивается зависимость пакетов, появляются накладные расходы по написанию тестов.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Во всем есть свои плюсы и минусы, когда мы хотим выиграть в чем-то, то можем (при не правильном подходе ), где-то проиграть. Главное что бы эффект от "плюсов" был в разы больше, чем последствия от минусов.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;* Возможно имеются и другие обычные мотивации для использования Одиночки, но просматривая информацию в Интернете, я натыкался на перечисленные мотивации.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1248856092595947833-6297771923722592189?l=design-patterns-perl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://design-patterns-perl.blogspot.com/feeds/6297771923722592189/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://design-patterns-perl.blogspot.com/2009/04/singlton-and-monostate.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1248856092595947833/posts/default/6297771923722592189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1248856092595947833/posts/default/6297771923722592189'/><link rel='alternate' type='text/html' href='http://design-patterns-perl.blogspot.com/2009/04/singlton-and-monostate.html' title='Singlton and Monostate'/><author><name>Шогин Михаил</name><uri>http://www.blogger.com/profile/14369966185004546420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://2.bp.blogspot.com/_z78QvFOum_E/SeoKvhcv2mI/AAAAAAAAAAM/dpIpt6-GnvE/S220/joni.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1248856092595947833.post-7629097734333509576</id><published>2009-04-23T12:33:00.000-07:00</published><updated>2009-11-10T03:51:43.099-08:00</updated><title type='text'>Паттерн Strategy</title><content type='html'>Ох уж эти паттерны. Но весчь хорошая и нужная.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Если разобраться, то паттерны мы используем всегда, просто не знаем о том, что это уже давно описанный шаблон проектирования. Мы просто снова и снова изобретаем колесо. Зачем? Почему? А потому что не читаем книг.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Стратегия.&lt;/div&gt;&lt;div&gt;Что такое стратегия? Не буду перепечатывать то, что можно нагуглить, скажу просто. &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Стратегия - &lt;/span&gt;не детализированный способ достижения поставленной цели.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Как мы обычно делаем?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;У нас имеется набор алгоритмов, с помощью которых мы решаем поставленную задачу. Когда нам необходимо, мы берем нужный нам алгоритм и выполняем поставленную задачу.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Как это обычно выглядит?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Предположим нам необходимо показать пользователю* блок с контекстной рекламой. При этом необходимо ротировать и таргетировать блоки по тем данным что мы знаем о пользователе, к примеру: регион, пол, возраст и т.д.&lt;/div&gt;&lt;div&gt;Мы реализовали несколько алгоритмов ротации: равномерная ротация, вытесняющая,  волновая и т.д.&lt;/div&gt;&lt;div&gt;Мы можем выбирать любой из этих алгоритмов, который мы хотим использовать в данный момент&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;if ($choice == ADV::EVEN) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;$blocks = &amp;amp;_getEvenDistribution($in_blocks);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;elsif ($choice == ADV::UNDU) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;$blocks = &amp;amp;_getEjectDistribution($in_blocks);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;..................&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;sub _getEvenDistribution&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;my $blocks= shift;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;#нахождение нужных блоков&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: normal; font-weight: normal; "&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;sub _getEjectDistribution&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;my $blocks= shift;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;#нахождение нужных блоков&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Что нам предлагает сделать паттерн Стратегия.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Создать интерфейс (абстрактный класс) Strategy&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Создать конкретные стратигии (алгоритмы) &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Создать контекст&lt;/li&gt;&lt;li&gt;Все это объединить&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Давайте это и сделаем:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;# базовый класс стратегии&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;package AbstractStrategy;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub new {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $self= shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# запрещаем создавать экземпляр этого класса&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;die "need object" if (!ref $self);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#что то делаем, если требуется&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;return $self;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# &lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;что то вроде абстрактного метода &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub rotate&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $self = shift;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;die "can not invoke";&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;# класс реализующий равномерную ротацию&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;package EvenStrategy&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;use base qw(AbstractStrategy);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;sub new&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;my $class = shift;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;my $self = bless {}, $class;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;return $self-&gt;SUPER::new(@_);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;#для простоты будем искать не группу блоков, а один&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;# группу можно найти, например обычной рекурсией, &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;#либо иным известным способом&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: normal; font-weight: normal; "&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;# sub    rotate($blocks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;# in       $blocks - массив хешей блоков&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;# out     $block - самый кликабельный&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub rotate&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my ($self, $blocks) = @_;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my ($commonWeight, $rand) = (0, 0);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#будем считать что блоки отсортированы по весу&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#если нет, то это просто сделать&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;for (@$blocks) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;$commonWeight += $_-&gt;{weight};&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;$_-&gt;{interval} = $commonWeight;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$rand = int(rand(0, $commonWeight));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#для простоты будем искать обычным перебором, &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#если блоков много лучше применять быстрый поиск&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;for ($i = 0; $i &lt; (scalar(@$blocks) -1); $i++) {&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;if( $rand &lt; $blocks-&gt;[$i]{weight}) {&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;        &lt;/span&gt;return $blocks-&gt;[$i];&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;}&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;#класс реализующий вытесняющую ротацию&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: normal; font-weight: normal; "&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;package EjectStrategy&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;use base qw(AbstractStrategy);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;sub new&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;my $class = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $self = bless {}, $class;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;return $self-&gt;SUPER::new(@_);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;# sub    rotate($blocks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;# in       $blocks - массив хешей блоков&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;# out     $block - самый кликабельный&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;sub rotate&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;my ($self, $blocks) = @_;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#сортируем по количеству кликов&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;@$blocks = sort { $a-&gt;{clicks} &lt;=&gt; $b-&gt;{clicks} } @$blocks;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;return ( pop @$blocks);&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;# Класс контекста&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;package AdvContext;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub new&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $class = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $strategy = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#запретим создание экземпляра, если нам подсунули&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;  # обект у которого нет метода rotate&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;if(!UNIVESAL::can($strategy, 'rotate')) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;die "need strategy";&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $self =  bless {strategy =&gt; $strategy }, $class;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;return $self;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub getBlock&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $self = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $blocks = shift;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;retrun $self-&gt;{strategy}-&gt;rotate($blcoks);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;#обработкичи запросов пользователей&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;.............&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;sub evenHandler&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;my $context = AdvContext-&gt;new(EvenStrategy-&gt;new());&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;return $context-&gt;getBlock($global-&gt;blocks);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;sub ejectHandler&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;my $context = AdvContext-&gt;new(EjectStrategy-&gt;new());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;return $context-&gt;getBlock($global-&gt;blocks);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Следует отметить, ввиду специфики языка программирования Perl, класс AbstractStrategy является бесполезным классом. Его описание и использование можно опустить.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Когда следует использовать паттерн стратегия:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="line-height:150%; font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-fareast-Times New Roman&amp;quot;; mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SAfont-family:&amp;quot;;font-size:12.0pt;color:black;"&gt;имеется много родственных классов, отличающихся только поведением&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" line-height: 24px;font-family:'Times New Roman';"&gt;&lt;span style="line-height:150%; font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-fareast-Times New Roman&amp;quot;; mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SAfont-family:&amp;quot;;font-size:12.0pt;color:black;"&gt;необходимо иметь несколько разных вариантов алгоритма&lt;/span&gt;&lt;span style="line-height:150%; font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-fareast-Times New Roman&amp;quot;; mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SAfont-family:&amp;quot;;font-size:12.0pt;color:black;"&gt;в алгоритме содержатся данные, о которых клиент не должен знать&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;паттерн стратегия позволяет не раскрывать сложные, специфичные для алгоритма структуры данных&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" line-height: 24px;font-family:'Times New Roman';"&gt;&lt;span style="line-height:150%; font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-fareast-Times New Roman&amp;quot;; mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SAfont-family:&amp;quot;;font-size:12.0pt;color:black;"&gt;в&lt;span style="font-variant:small-caps"&gt; &lt;/span&gt;классе определено много поведений, что представлено разветвленными условными операторами&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;На этой ноте хочется закончить.&lt;/div&gt;&lt;div&gt;В следующий раз рассмотрим паттерн Template Method.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;* &lt;/span&gt;Так как основная моя деятельность&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt; &lt;/span&gt;связана с web-разработкой, примеры я буду брать из этой сферы.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;6F8BE4F65AE4EF89E47FDFD31E564CB3&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1248856092595947833-7629097734333509576?l=design-patterns-perl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://design-patterns-perl.blogspot.com/feeds/7629097734333509576/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://design-patterns-perl.blogspot.com/2009/04/strategy.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1248856092595947833/posts/default/7629097734333509576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1248856092595947833/posts/default/7629097734333509576'/><link rel='alternate' type='text/html' href='http://design-patterns-perl.blogspot.com/2009/04/strategy.html' title='Паттерн Strategy'/><author><name>Шогин Михаил</name><uri>http://www.blogger.com/profile/14369966185004546420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://2.bp.blogspot.com/_z78QvFOum_E/SeoKvhcv2mI/AAAAAAAAAAM/dpIpt6-GnvE/S220/joni.jpg'/></author><thr:total>0</thr:total></entry></feed>
