>  기사  >  백엔드 개발  >  PHP 디자인 패턴 - 어댑터 패턴 어댑터

PHP 디자인 패턴 - 어댑터 패턴 어댑터

WBOY
WBOY원래의
2016-07-29 09:14:50980검색

애플리케이션에서 문서화된 코드 베이스를 사용할 수 있지만, 기존 객체를 다른 방식으로 사용해야 하는 새로운 기능을 추가하는 경우가 많습니다. 새 기능에 다른 이름이 필요할 수도 있고, 원래 객체와 약간 다른 동작이 필요할 수도 있습니다.

위의 문제를 해결하려면 어댑터 모드를 사용하는 것이 좋은 해결책입니다. 어댑터 패턴을 사용하여 또 다른 객체를 만듭니다. 이 어댑터객체는 원래 애플리케이션과 새 기능 사이의 중개자 역할을 합니다. 어댑터 디자인 패턴 은 단순히 객체 의 인터페이스를 다른 객체 에서 예상하는 인터페이스에 적용합니다.

코드 예:

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();

어느 날 요구 사항이 변경되면 CSV 파일에 오류를 기록해야 합니다. CSV 형식에서는 첫 번째 열이 숫자 오류 코드여야 합니다. , 두 번째 열은 오류 텍스트입니다. 새로운 요구 사항에는 로깅을 구현하는 코드가 제공되었지만 문제는 코드가 현재 사용되는 것과 다른 다른 버전의 errorObject를 기반으로 작성된다는 것입니다. 새로운 errorObject 클래스에는 logToCSV 클래스에서 사용되는 getErrorNumber() 및 getErrorText()라는 두 가지 다른 메서드가 있습니다.
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();

Object의 인터페이스를 다른 Object로 변환해야 할 때 AdapterObject를 구현하는 것이 모범 사례일 뿐만 아니라 , 그리고 많은 문제를 줄일 수도 있습니다. 어댑터 모드의 일반적인 사용 시나리오:

● 데이터베이스 드라이버(각 프레임워크의 드라이버 소스 코드를 볼 수 있음)


● 웹 서비스(여러 다른 웹 서비스에서 어댑터 사용)


위 내용은 PHP 디자인 패턴 - Adapter 패턴을 소개하고 관련 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.