sexta-feira, 29 de outubro de 2010

Design Patterns (PHP) - Strategy

Strategy

Nesse padrão, os algoritmos são extraídos de classes complexas para que eles possam ser facilmente substituidos.

Objetivos:

  • Definir uma família de algoritmos, encapsular cada um, e torná-los intercambiáveis
  • Strategy permite mudar os algoritmos independentemente dos clientes que os usam

Use Strategy quando:

  • Várias classes relacionadas diferem apenas em seus comportamentos. Strategy proporciona um modo de configurar uma classe com um de muitos comportamentos.
  • Você precisa de diferentes variantes de um algoritmo.
  • Uma classe define muitos comportamentos, e eles aparecem como múltiplas declarações condicionais nas suas operações. Ao invés de várias condições, mova desvios condicionais relacionados para sua propria classe Strategy.
Exemplo:

Para exemplificar a solução do problema apresentado no início do artigo, vamos criar a interface MeioTransporte, que representará todo e qualquer veículo capaz de transportar alguma coisa, com suas devidas implementações:


interface MeioTransporte
{
public function transportar();
}

class Aviao implements MeioTransporte
{
public function transportar()
{
print('voando nos céus...');
}
}

class Carro implements MeioTransporte
{
public function transportar()
{
print('andando sobre a estrada...');
}
}

A partir dessa estrutura, já temos nossos diferentes algoritmos encarregados de conversar com o requisitante. Dessa forma, nosso método transportar() poderá se comportar da maneira que a aplicação decidir, sempre de acordo com a requisição feita pelo usuário.

Agora, sim, ao criarmos a abstração de Veículo, teremos uma estrutura pronta para determinar o fluxo da aplicação:

abstract class Veiculo
{

private $meioTransporte;
public function setMeioTransporte( MeioTransporte $meioTransporte )
{
$this
->meioTransporte = $meioTransporte;
}
public function transportar()
{
$this
->meioTransporte->transportar();
}
}

Depois de criarmos a abstração da classe Veículo, podemos criar os veículos em si, sem nos preocuparmos com a implementação do método transportar(), que já será manipulado pela estrutura que criamos anteriormente:

class Boeing extends Veiculo
{

public function __construct()
{
$this
->setMeioTransporte( new Aviao() );
}
}

class
Fusca extends Veiculo
{

public function __construct()
{
$this
->setMeioTransporte( new Carro() );
}
}

Com essa implementação do Strategy, garantimos a organização estrutural da nossa hierarquia, e permitimos que a aplicação manipule, da maneira que a estruturamos, como será o fluxo de sua resposta à requisição.

Se criarmos, agora, um objeto de cada tipo representado na implementação, e invocarmos o método transportar(), herdado por cada um da abstração de Veículo, da seguinte maneira:

$carro = new Carro();
$aviao
= new Aviao();
$carro
->transportar();
$aviao
->transportar();

Teríamos a seguinte saída:

andando sobre a estrada...
voando nos c
éus...


Nenhum comentário:

Postar um comentário