Код (Text): ******************************************************************** 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']);