gracias por la respuesta.... y que opinas sobre en ves de estructurar los directorios por capas de la aplicacion hacerlo por funcionalidad??? por que en este caso si quiero reutilizar algo tendria que copiarme el controlador, el modelo, la vista de cada directorio, que tal si me se lo agrupa mejor por "entidades" o "funcionalidad" digamos Usuarios, Empleados, Autenticacion o cosas asi??
Como separarias las siguientes clases?
Código PHP:
<?php
/********************************************************************
Model-View-Controller implementation according to POSA
(Pattern-Oriented Software Architecture
http://www.hillside.net/patterns/books/Siemens/book.html)
********************************************************************/
class HelloWorldController
{
private $model;
function __construct($model)
{
$this->model = $model;
}
function handleEvent($args)
{
$this->model->setStrategy($args[2]);
$this->model->addText($args[1]);
}
}
class HelloWorldModel
{
private $text;
private $observers = array();
private $strategy;
function attach($observer)
{
$this->observers[] = $observer;
}
function getData()
{
$facade = new HelloWorldFacade($this->strategy);
return $facade->getHelloWorld().$this->text."\n";
}
function addText($text='')
{
$this->text = $text;
$this->notify();
}
function setStrategy($strategy)
{
$this->strategy = $strategy;
}
function notify()
{
foreach ($this->observers as $observer)
{
$observer->update();
}
}
}
class HelloWorldView
{
private $model;
function initialize($model)
{
$this->model = $model;
$model->attach($this);
return $this->makeController();
}
function makeController()
{
return new HelloWorldController($this->model);
}
function update()
{
$this->display();
}
function display()
{
echo $this->model->getData();
}
}
/*********************************************************************
"Business logic"
********************************************************************/
class HelloWorld
{
function execute() {
return "Hello world";
}
}
class HelloWorldDecorator
{
private $helloworld;
function __construct($helloworld)
{
$this->helloworld = $helloworld;
}
function execute()
{
return $this->helloworld->execute();
}
}
abstract class HelloWorldEmphasisStrategy
{
abstract function emphasize($string);
}
class HelloWorldBangEmphasisStrategy extends HelloWorldEmphasisStrategy
{
function emphasize($string)
{
return $string."!";
}
}
class HelloWorldRepetitionEmphasisStrategy extends HelloWorldEmphasisStrategy
{
function emphasize($string)
{
return $string." and ".$string." again";
}
}
class HelloWorldEmphasizer extends HelloWorldDecorator
{
private $strategy;
function HelloWorldEmphasizer($helloworld,$strategy)
{
$this->strategy = $strategy;
parent::__construct($helloworld);
}
function execute()
{
$string = parent::execute();
return $this->strategy->emphasize($string);
}
}
class HelloWorldStrategyFactory
{
static function make($type)
{
if ($type == 'repetition')
return self::makeRepetitionStrategy();
return self::makeBangStrategy();
}
static function makeBangStrategy()
{
return new HelloWorldBangEmphasisStrategy;
}
static function makeRepetitionStrategy()
{
return new HelloWorldRepetitionEmphasisStrategy;
}
}
class HelloWorldFormatter extends HelloWorldDecorator
{
function execute()
{
$string = parent::execute();
return $string."\n";
}
}
class HelloWorldFacade
{
private $strategy;
function __construct($strategyType)
{
$this->strategy = HelloWorldStrategyFactory::make
($strategyType);
}
function getHelloWorld()
{
$formatter = new HelloWorldFormatter(
new HelloWorldEmphasizer(
new HelloWorld,$this->strategy));
return $formatter->execute();
}
}
$model = new HelloWorldModel;
$view = new HelloWorldView;
$controller = $view->initialize($model);
$controller->handleEvent($_SERVER['argv']);
?>