LEARNING DESIGN PATTERNS
<?php
class Worker extends Player{
}
class Settler extends Player{
}
class Warrior extends Player{
}
<?php
class Player{
public function move(){
// move
}
public function attack(){
// punch
}
public function sayHello(){
echo "Hello";
}
}
<?php
class Worker extends Player{
// some extra worker methods
}
class Settler extends Player{
// some extra settler methods
}
class Warrior extends Player{
// some extra settler methods
public function attack(){
// attack with sword
}
}
<?php
interface MoveBehaviour{
public function move();
}
class Walk implements MoveBehaviour{
public function move(){
// move
}
}
class Run implements MoveBehaviour{
public function move(){
// run
}
}
class RideHorse implements MoveBehaviour{
public function move(){
// ride a horse
}
}
<?php
interface AttackBehaviour{
public function move();
}
class Punch implements AttackBehaviour{
public function move(){
// punch
}
}
class SwordAttack implements AttackBehaviour{
public function move(){
// attack with sword
}
}
class NoAttack implements AttackBehaviour{
public function move(){
// do nothing
}
}
<?php
class Player{
private $moveBehaviour;
private $attackBehaviour;
public function __construct(MoveBehaviour $move, AttackBehaviour $attack){
$this->moveBehaviour = $moveBehaviour;
$this->attackBehaviour = $attackBehaviour;
}
public function performMove(){
$this->moveBehaviour->move();
}
public function performAttack(){
$this->attackBehaviour->attack();
}
//
}
<?php
$player = new Explorer(new Run(),new NoAttack());
$player = new Worker(new Walk(),new Punch());
<?php
class Player{
// ...
public function setAttackBehaviour(MoveBehaviour $moveBehaviour){
$this->moveBehaviour = $moveBehaviour;
}
public function setAttackBehaviour(AttackBehaviour $attackBehaviour){
$this->attackBehaviour = $attackBehaviour;
}
// ...
}
<?php
// ...
$explorer = new Explorer(new Run(),new NoAttack());
// explorer found a sword
$explorer->setBehaviour(new SwordAttackBehaviour());