[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: "Hello Wold" в патернах
Страницы: 1, 2, 3
Patrick
PHP
  1. <?php
  2. /********************************************************************
  3. Model-View-Controller implementation according to POSA
  4. (Pattern-Oriented Software Architecture
  5. ********************************************************************/
  6.  
  7. class HelloWorldController {
  8. private $model;
  9. function __construct($model) {
  10. $this->model = $model;
  11. }
  12.  
  13. function handleEvent($args) {
  14. $this->model->setStrategy($args[2]);
  15. $this->model->addText($args[1]);
  16. }
  17. }
  18.  
  19.  
  20. class HelloWorldModel {
  21. private $text;
  22. private $observers = array();
  23. private $strategy;
  24. function attach($observer) {
  25. $this->observers[] = $observer;
  26. }
  27.  
  28. function getData() {
  29. $facade = new HelloWorldFacade($this->strategy);
  30. return $facade->getHelloWorld().$this->text." ";
  31. }
  32.  
  33. function addText($text='') {
  34. $this->text = $text;
  35. $this->notify();
  36. }
  37.  
  38. function setStrategy($strategy) {
  39. $this->strategy = $strategy;
  40. }
  41. function notify() {
  42. foreach ($this->observers as $observer) {
  43. $observer->update();
  44. }
  45. }
  46. }
  47.  
  48. class HelloWorldView {
  49. private $model;
  50.  
  51. function initialize($model) {
  52. $this->model = $model;
  53. $model->attach($this);
  54. return $this->makeController();
  55. }
  56.  
  57. function makeController() {
  58. return new HelloWorldController($this->model);
  59. }
  60.  
  61. function update() {
  62. $this->display();
  63. }
  64.  
  65. function display() {
  66. echo $this->model->getData();
  67. }
  68. }
  69.  
  70.  
  71. /*********************************************************************
  72. "Business logic"
  73. ********************************************************************/
  74.  
  75. class HelloWorld {
  76. function execute() {
  77. return "Hello world";
  78. }
  79. }
  80.  
  81. class HelloWorldDecorator {
  82. private $helloworld;
  83. function __construct($helloworld) {
  84. $this->helloworld = $helloworld;
  85. }
  86.  
  87. function execute() {
  88. return $this->helloworld->execute();
  89. }
  90. }
  91.  
  92. abstract class HelloWorldEmphasisStrategy {
  93. abstract function emphasize($string);
  94. }
  95.  
  96. class HelloWorldBangEmphasisStrategy extends HelloWorldEmphasisStrategy {
  97. function emphasize($string) {
  98. return $string."!";
  99. }
  100. }
  101.  
  102. class HelloWorldRepetitionEmphasisStrategy extends HelloWorldEmphasisStrategy {
  103. function emphasize($string) {
  104. return $string." and ".$string." again";
  105. }
  106. }
  107.  
  108. class HelloWorldEmphasizer extends HelloWorldDecorator {
  109. private $strategy;
  110. function HelloWorldEmphasizer($helloworld,$strategy) {
  111. $this->strategy = $strategy;
  112. parent::__construct($helloworld);
  113. }
  114.  
  115. function execute() {
  116. $string = parent::execute();
  117. return $this->strategy->emphasize($string);
  118. }
  119. }
  120.  
  121. class HelloWorldStrategyFactory {
  122. static function make($type) {
  123. if ($type == 'repetition') return self::makeRepetitionStrategy();
  124. return self::makeBangStrategy();
  125. }
  126.  
  127. static function makeBangStrategy() {
  128. return new HelloWorldBangEmphasisStrategy;
  129. }
  130. static function makeRepetitionStrategy() {
  131. return new HelloWorldRepetitionEmphasisStrategy;
  132. }
  133. }
  134.  
  135. class HelloWorldFormatter extends HelloWorldDecorator {
  136. function execute() {
  137. $string = parent::execute();
  138. return $string." ";
  139. }
  140. }
  141.  
  142. class HelloWorldFacade {
  143. private $strategy;
  144. function __construct($strategyType) {
  145. $this->strategy = HelloWorldStrategyFactory::make($strategyType);
  146. }
  147.  
  148. function getHelloWorld() {
  149. $formatter = new HelloWorldFormatter(
  150. new HelloWorldEmphasizer(
  151. new HelloWorld,$this->strategy));
  152. return $formatter->execute();
  153. }
  154. }
  155.  
  156. $model = new HelloWorldModel;
  157. $view = new HelloWorldView;
  158. $controller = $view->initialize($model);
  159. $controller->handleEvent($_SERVER['argv']);
  160.  
  161. ?>


Советую разобраться начинающим...

_____________
vasa_c
А где высокая культура комментариев?
Patrick
Цитата(vasa_c @ 2.2.2007, 15:15) [snapback]12145[/snapback]

А где высокая культура комментариев?

Я вообще против коментов...

_____________
PantiL
ИМХО реальное извращение :) сам понял что написал?

Хороша веревка длинная, а программа короткая :) - я даже разбираться не стал, уж больно много лишнего кода для Хелло Мир
Ghost
Цитата
А где высокая культура комментариев?


АФТАР ЖЖОТ!!! ПЕШИ ИЩЁ!!


Цитата
Что же однозначно квалифицирует язык как объектно-ориентированный? Одни полагают, что если язык содержит объекты, инкапсурирующие свойства и методы, то его уже можно называть объектно-ориетированым. Другие добавляют к этому определению полиморфизм, наследование и возможность сокрытия данных (модификаторы области видимости) Борцы за чистоту идеи наверняка бы составили многостраничный список из того, сто по их мнению должен поддерживать объектно-ориентированный язык..... Готов спорить, что они никогда не согласятся друг с другом из-за разнообразия ООязыков, каждый из которрых хорош для решения своего круга задач...

Однако большинство из вас наверняка согласятся с тем, что ООП - это не только синтаксис языка, но и образ мышления самого программиста..
(особенно это сказывается на стадии проектирования)

Гаспада, вам представлен простенький клас, в котором реализованы классические шаблоны проектирования:
лично мне из этого всего разнообразия знакомы шаблоны: стратегии, фабрики классов, наблюдатель.
но вообще тут еще дофига полезной логики. разобраться стоит..

тока эта, нельзя так жестоко народ обманывать, это не савсем начинающим, а начинающим думать на уровне ООП :)
BlackTheMad
ИМХО, вкуривать в шаблоны, глядя на готовый пример ХеллоуВорлда, сложно. И может не стоить того. Ибо если мосК уже заточен под ООП, то всё будет понятно, не понятно только, как человек ещё не сталкивался с дезигн паттернс... А если мосК ещё не заражён ООП, то нафиК ему это всё будет не нужно. Он только улыбнёцо тихо, в очередной раз уверившись, что "эти ООПэшники" ваще странные люди.
Если уж начинать курить шаблоны, то стоит сначала плотно разобраться с самим ООП...посмотреть как делается грамотная декомпозици и прочее...а потом уже...прочитав, быть может, книгу GOF Design Patterns с примерами на C++ и SmallTalk 80...хотя вряд ли...лучше тогда прочитать изданную php|Architect'ом книгу про дезигн паттернс с примерами на php...хотя она на англицком...
Зачем, собсно, столько флуда. А затем, чтобы удержать нубов от написания хеллоуВорлдов с применением MVC и всяких декораторов-фасадов-фабрик. Сначала стоит понять шо за...и зачем оно.
Ghost
Позволю себе не согласится с таким обилием негатива, ибо ...

...ибо имхо конечно, подобные этюды развивают помимо моска еще чувство юмора :). специфического правда %)
Timok
Patrick, не ну комментами надо было снабдить... :( а то не очень понятно (говорю как человек, начинающий изучать ооп)
Leningrad00
----
max_ru
ГГ, сколько ты туда паттернов впихнул даже считать не стал. (Но точно не все, гг =) )
php_maestro
Про комменты - очень важное замечание, они помогают не только в понимании происходящего в коде, но и в навигации по коду по ходу пьесы ... а, вообще, хотя б перед самим классом и перед методами надо писать что от них полезного может получить их пользователь. А так эти невидимые плюсы нужно долго вытягивать из самого кода.

Короче, я тоже разбираться не стал, так как и так хорошо шарю. Мне рекламу класса в комментах надо увидеть для интереса.
QZip
Оно конечно код полезный, но хотелось ба ссылочек на учебники по ООП.
Patrick
Google.com

_____________
set_rus
вау...

_____________
Capcha
Имхо без ООП никак, вся эта логика просто необходима для обильных структур кода.
Но большенство пхпехеров просто не знают про ООП и пропускают это чудо.

ДЕТИ УЧИТИ ООП!

_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.