Как модель обновляет представление в шаблоне MVC?

Я не понимаю структуру шаблона MVC.

В некоторых местах при поиске в Google я обнаружил, что модель обновляет все те представления, которые подписаны на эту модель. Как модель обновляет представление в шаблоне MVC?

Может ли кто-нибудь дать мне простое и ясное представление о том, как это происходит, на примере?

Спасибо


person Wearybands    schedule 06.02.2013    source источник


Ответы (1)


MVC имеет множество разновидностей. Похоже, вы читали о шаблоне контролирующего контроллера, в котором вид наблюдает за изменениями в модели.

Я вижу из ваших прошлых вопросов и ответов, что вам нравится php. Я не уверен, насколько распространен ведущий ведущий в php (я, конечно, никогда не использовал его, но мне интересно узнать, используют ли другие). Это обычное дело в приложениях .Net (например, winforms), где модель может быть привязана к элементу управления пользовательского интерфейса. Представление уведомляется об изменениях в модели путем подписки на события модели.

В любом случае, поскольку я подумал, что было бы весело попробовать на php, я собрал пример:

<?php

$input = array(2, 3, 4, 5, 6, 7, 8, 9, 10);

$model = new model(1);
$controller = new controller(
              $model, new view($model, 0), new view($model, 2)
              );

$controller->doAction($input);

class model {
  //the model changed event
  public $modelChangedEvent = array();
  private $val;

  public function __construct($val) {
     $this->val = $val;
  }

  public function setVal($val) {
     $this->val = $val;
     //raise the model changed event because the model state has changed
     $this->raiseModelChangedEvent();
  }

  public function getSquaredVal() {
     return pow($this->val, 2);
  }

  private function raiseModelChangedEvent() {
     foreach ($this->modelChangedEvent as $handler)
        call_user_func($handler);
  }

}

class view {

  private $model;
  private $decimalPlaces;
  private $valueHistory = array();

  public function __construct($model, $decimalPlaces) {
    $this->model = $model;
    $this->valueHistory[] = $model->getSquaredVal();
    $this->decimalPlaces = $decimalPlaces;
    //listen to the model changed event and call handler
    $this->model->modelChangedEvent[] = array(
                             $this,
                             'modelChangedEventHandler'
                              );
  }

  public function showView() {
    $formatted = array_map(
                 array($this, 'getFormattedValue'), $this->valueHistory
                 );
    echo implode('<br/>', $formatted), '<br/><br/>';
  }

  public function modelChangedEventHandler() {
     $this->valueHistory[] = $this->model->getSquaredVal();
  }

  private function getFormattedValue($val) {
     return number_format($val, $this->decimalPlaces);
  }

}

class controller {

   private $model;
   private $view1;
   private $view2;

   public function __construct($model, $view1, $view2) {
     $this->model = $model;
     $this->view1 = $view1;
     $this->view2 = $view2;
   }

   public function doAction($input) {
     foreach ($input as $val) $this->model->setVal($val);
     $this->view1->showView();
     $this->view2->showView();
   }

}
?>
person Community    schedule 09.02.2013