5

MVCパターンの構造について混乱しています。

グーグルで検索しているときにいくつかの場所で、モデルがそのモデルにサブスクライブされているすべてのビューを更新することがわかりました。モデルはMVCパターンでビューをどのように更新しますか?

誰かが例を挙げて、これがどのように起こるかについて簡単で明確な考えを私に与えることができますか?

ありがとう

4

1 に答える 1

4

MVCにはさまざまなフレーバーがあります。モデルの変更時にビューが監視する監視コントローラーのパターンについて読んでいたようです。

私はあなたの過去の質問と答えからあなたがphpが好きだとわかります。監督するプレゼンターがphpでどれほど一般的かはわかりません(私は確かにこれを使用したことはありませんが、他の人が使用しているかどうかを知りたいと思っています)。これは、モデルをUIコントロールにデータバインドできる.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();
   }

}
?>
于 2013-02-09T04:58:34.393 に答える