Created
September 8, 2021 12:54
-
-
Save Yalme/86240c484f9f673afd898a19d1e45866 to your computer and use it in GitHub Desktop.
"Hello World" in patterns (overengineering).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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']); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment