2010-02-12 5 views
2

Room 클래스에는 명령 패턴을 사용하기 전에 내가 사용한 많은 메서드가 있습니다. 이전에는 명령을 많이 호출하고 있었고 이제는 모든 메서드에 대해 내 roomParser 클래스에서 메서드를 만들어야하는 것으로 보입니다. sayHotelCode라고 말하고 싶다면 roomParser에 메서드를 반복 작성하고 메서드를 호출해야합니다. 이것이 제가 명령 패턴을 사용해야하는 방법입니까?명령 패턴을 사용해야합니까?

<?php 

interface Parseable { 

    public function parse($arr, $dept); 
} 

class Room implements Parseable { 

    protected $_adults; 
    protected $_kids; 
    protected $_startDate; 
    protected $_endDate; 
    protected $_hotelCode; 
    protected $_sessionNs; 
    protected $_minRate; 
    protected $_maxRate; 
    protected $_groupCode; 
    protected $_rateCode; 
    protected $_promoCode; 
    protected $_confCode; 
    protected $_currency = 'USD'; 
    protected $_soapAction; 
    protected $_soapHeaders; 
    protected $_soapServer; 
    protected $_responseXml; 
    protected $_requestXml; 

    public function __construct($startdate,$enddate,$rooms=1,$adults=2,$kids=0) { 
     $this->setNamespace(SESSION_NAME); 
     $this->verifyDates($startdate, $enddate); 

     $this->_rooms= $rooms; 
     $this->_adults= $adults; 
     $this->_kids= $kids; 

     $this->setSoapAction(); 
     $this->setRates(); 
    } 

    public function parse($arr, $dept) { 
     $this->_price = $arr * $dept * rand(); 
     return $this; 
    } 

    public function setNamespace($namespace) { 
     $this->_sessionNs = $namespace; 
    } 

    private function verifyDates($startdate, $enddate) {} 

    public function setSoapAction($str= 'CheckAvailability') { 
     $this->_soapAction = $str; 
    } 

    public function setRates($rates='') { } 

    public function setHotelCode($code) { $this->_hotelCode = $code; } 

    private function getSoapHeader() { 
     return '<?xml version="1.0" encoding="utf-8"?> 
      <soap:Header> 
      </soap:Header>'; 
    } 

    private function getSoapFooter() { 
     return '</soap:Envelope>'; 
    } 

    private function getSource() { 
     return '<POS> 
      <Source><RequestorId ID="" ID_Context="" /></Source> 
      </POS>'; 
    } 

    function requestXml() { 
     $this->_requestXml = $this->getSoapHeader(); 
     $this->_requestXml .='<soap:Body></soap:Body>'; 
     return $this->_requestXml; 
    } 

    private function setSoapHeaders ($contentLength) { 
     $this->_soapHeaders = array('POST /url HTTP/1.1', 
      'Host: '.SOAP_HOST, 
      'Content-Type: text/xml; charset=utf-8', 
      'Content-Length: '.$contentLength); 
    } 
} 

class RoomParser extends SplObjectStorage { 

    public function attach(Parseable $obj) { 
     parent::attach($obj); 
    } 

    public function parseRooms($arr, $dept) { 
     for ($this->rewind(); $this->valid(); $this->next()) { 
      $ret = $this->current()->parse($arr, $dept); 
      echo $ret->getPrice(), PHP_EOL; 
     } 
    } 
} 

$arrive = '12/28/2010'; 
$depart = '01/02/2011'; 
$rooms = new RoomParser($arrive, $depart); 
$rooms->attach(new Room('12/28/2010', '01/02/2011')); 
$rooms->attach(new Room('12/29/2010', '01/04/2011')); 
echo $rooms->count(), ' Rooms', PHP_EOL; 

편집 : 나는 모든 객체가 공유하는 특성을 저장하여 RoomParser 덜 일반적인 만들어두면 편리하게 할 수있다 생각하고 있어요. 비록 내가 특정 객체를 오버라이드하고 싶다면 아마 메소드를 만들어야 할 것이다.

답변

1

이 수업은 적어도 세 가지 다른 일을하고있는 것처럼 보입니까? (룸 예약 데이터 저장, SOAP 패킷 생성, SOAP 전송 처리). 귀하의 parse() 함수는 약간의 수수께끼입니다 ...

더 간단한 Room 클래스를 만들었습니까?

class Room 
{ 
    protected $_properties = array('numberOfAdults' => 0, 'numberOfKids' => 0, ... etc); 

    function __set($name, $value) 
    { 
    if (!isset($this->_properties[$name])) throw new Exception('Invalid property ' . $name); 
    $this->_properties[$name] = $value; 
    } 

    ... etc ... 
} 
관련 문제