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