Mediator

かなり消化不足だけどとりあえず残しておく。結城センセイの本にあるMediatorパターンが一番わかりやすそうだけれどJavaで実装はしたことないからJavaScriptとブラウザを使おうかどうか思案中。。

<?php
class User {
  private $chatroom;
  private $name;
  public function __construct($name){
    $this->name = $name;
  }
  public function getName(){
    return $this->name;
  }
  public function setChatroom(Chatroom $value){
    $this->chatroom = $value;
  }
  public function sendMessage($to, $message){
    $this->chatroom->sendMessage($this->name, $to, $message);
  }
  public function receiveMessage($from, $message){
    printf('<font color="008800">%sさんから%sさんへ</font>: %s<hr>', $from, $this->getName(), $message);
  }
}

class Chatroom {
  private $users = array();
  public function login(User $user){
    $user->setChatroom($this);
    if(!array_key_exists($user->getName(), $this->users)){
      $this->users[$user->getName()] = $user;
      printf('<font color="#0000dd#>%sさんが入室しました</font><hr>', $user->getName());
    }
  }
  public function sendMessage($from, $to, $message){
    if(array_key_exists($to, $this->users)){
      $this->users[$to]->receiveMessage($from, $message);
    } else {
      printf('<font color="#dd0000">%sさんは入室していないようです</font><hr>', $to);
    }
  }
}

$chatroom = new Chatroom();
$sasaki = new User('佐々木');
$suzuki = new User('鈴木');
$chatroom->login($sasaki);
$chatroom->login($suzuki);
$sasaki->sendMessage('鈴木', 'yorosiku');
$suzuki->sendMessage('sasaki', 'arigatou');
?>