Skip to content

Instantly share code, notes, and snippets.

@tiagodavi
Created March 12, 2012 00:56
Show Gist options
  • Save tiagodavi/2018977 to your computer and use it in GitHub Desktop.
Save tiagodavi/2018977 to your computer and use it in GitHub Desktop.
Design Pattern Strategy PHP
#Armamentos/Armamento.php
<?php
//Qualquer tipo de arma deve implementar armamento
interface Armamento{
//Deve obrigatoriamente poder ser utilizada
public function usar();
}
#Armamentos/Espada.php
<?php
require_once 'Armamento.php'; //Interface Armamento
class Espada
implements Armamento{
public function usar()
{
echo 'Golpe com espada!'; //Tipo de golpe com espada
}
}
#Armamentos/Magia.php
<?php
require_once 'Armamento.php'; //Interface Armamento
class Magia
implements Armamento{
private $combinacoes; //Podem haver combinações de magias
public function __construct($params = array())
{
foreach($params as $magia){
$this->combinacoes[] = $magia;
}
}
public function usar()
{
if(empty($this->combinacoes)){
echo 'Golpe de magia negra!'; // a magia normal (sem combinações) é um golpe de magia negra
}else{
//As combinações podem ser qualquer uma! Sinistro..
foreach($this->combinacoes as $magia){
echo $magia.'<br>';
}
}
}
}
#Guerreiros/Guerreiro.php
<?php
abstract class Guerreiro{
//Todo guerreiro tem um nome, tem um tipo e tem um armamento
private $nome, $tipo, $armamento;
//Seta propriedades
public function set_options($params = array())
{
//Percorre o array, se a propriedade existir..seta
foreach($params as $key => $value){
if(property_exists($this,$key)){
$this->$key = $value;
}
}
}
//Seta uma propriedade por vez
public function __set($propriedade,$valor)
{
$this->$propriedade = $valor;
}
//Pega uma propriedade por vez
public function __get($propriedade)
{
return $this->$propriedade;
}
//Todo guerreiro deve ser capaz de lutar :)
protected abstract function lutar();
}
#Guerreiros/Rei.php
<?php
require_once 'Guerreiro.php'; // Rei é um guerreiro
require_once 'Armamentos/Espada.php'; // Tem espada
require_once 'Armamentos/Magia.php'; // Tem magia
class Rei
extends Guerreiro{
public function __construct($params = array())
{
$this->set_options($params);
}
public function lutar()
{
echo $this->__get('nome').'<br>';
echo $this->__get('tipo').'<br>';
echo $this->__get('armamento')->usar();
}
}
#index.php
<?php
/*
Aqui teremos um combate entre o rei do Brasil e o rei dos EUA!
*/
require_once 'Guerreiros/Rei.php'; //Adicionar o Rei
//O primeiro golpe vem do rei do Brasil
$rei_do_brasil = new Rei(array('nome' => 'Dilma','tipo' => 'Rei do Brasil', 'armamento' => new Espada));
$rei_do_brasil->lutar();
/*
Dilma
Rei do Brasil
Golpe com espada!
*/
echo '<hr>';
// O segundo golpe vem do rei dos EUA
// Podemos mudar o armamento do rei em tempo de execução graças ao Strategy :)
$rei_do_eua = new Rei(array('nome' => 'Obama','tipo' => 'Rei dos EUA','armamento' => new Magia));
$rei_do_eua->lutar();
/*
Obama
Rei dos EUA
Golpe de magia negra!
*/
echo '<hr>';
//Magias combinadas
$magias = array(
'BigBrother Brasil',
'Corrupção',
'Atraso na construção dos estádios',
'Briga no carnaval',
'Impostos altos',
'64% de aumento nas barcas SA'
);
//O rei do Brasil ficou furioso com a magia negra e agora decidiu combinar várias magias!!
//Alteramos também o armamento do rei do Brasil que antes era apenas uma espada..
//E agora é tanta coisa ruim combinada que o rei dos EUA não resistiu.. :)
$rei_do_brasil->__set('armamento', new Magia($magias));
$rei_do_brasil->lutar();
/*
Dilma
Rei do Brasil
BigBrother Brasil
Corrupção
Atraso na construção dos estádios
Briga no carnaval
Impostos altos
64% de aumento nas barcas SA
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment