애플리케이션에서 문서화된 코드 베이스를 사용할 수 있지만, 기존 객체를 다른 방식으로 사용해야 하는 새로운 기능을 추가하는 경우가 많습니다. 새 기능에 다른 이름이 필요할 수도 있고, 원래 객체와 약간 다른 동작이 필요할 수도 있습니다.
위의 문제를 해결하려면 어댑터 모드를 사용하는 것이 좋은 해결책입니다. 어댑터 패턴을 사용하여 또 다른 객체를 만듭니다. 이 어댑터객체는 원래 애플리케이션과 새 기능 사이의 중개자 역할을 합니다. 어댑터 디자인 패턴 은 단순히 객체 의 인터페이스를 다른 객체 에서 예상하는 인터페이스에 적용합니다.
코드 예:
class errorObject{ private $_error; public function __construct($error){ $this->_error = $error; } public function getError(){ return $this->_error; } } class logToConsole{ private $_errorObject; public function __construct($errorObject){ $this->_errorObject = $errorObject; } public function write(){ fwrite(STDERR, $this->_errorObject->getError()); } } $error = new errorObject("404:Not Found"); $log = new logToConsole($error); $log->write();
class logToCSV{ const CSV_LOCATION = "log.csv"; private $_errorObject; public function __construct($errorObject){ $this->_errorObject = $errorObject; } public function write(){ $line = $this->_errorObject->getErrorNumber(); $line .= ','; $line .= $this->_errorObject->getErrorText(); $line .= '\n'; file_put_contents(self::CSV_LOCATION, $line, FILE_APPEND); } }이 문제를 해결하기 위해 다음 두 가지 솔루션을 채택할 수 있습니다.
● 기존 코드 베이스의 errorObject 클래스를 생성합니다.
● Adapter 클래스를 생성합니다.
이러한 공용 인터페이스의 표준화를 유지해야 한다는 점을 고려하여 Adapter를 생성합니다. 객체가 최고의 솔루션입니다.
기존 errorObject의 기능이 새로 생성된 어댑터객체 에 있어야 하며, getErrorNumber() 및 getErrorText() 메서드가 유효해야 합니다.
class logToCSVAdapter extends errorObject{ private $_errorNumber, $_errorText; public function __construct($error){ parent::__construct($error); $parts = explode(':', $this->getError()); $this->_errorNumber = $parts[0]; $this->_errorText = $parts[1]; } public function getErrorNumber(){ return $this->_errorNumber; } public function getErrorText(){ return $this->_errorText; } } $error = new logToCSVAdapter("404:Not Found"); $log = new logToCSV($error); $log->write();한