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.
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