PHP 디자인 모드 - 어댑터 모드 (연마 디자인 모드 학습 노트)

필요: 로 그 를 파일 에 기록 하기 만 하면 됩 니 다.로그 시스템
/**
 *        
 * @author ranping 
 */
class LogModel {
	private $logId;
	private $operateUser;
	private $operateTime;
	private $logContent;
	
	public function getLogId() {
		return $this->logId;
	}

	public function getOperateUser() {
		return $this->operateUser;
	}

	public function getOperateTime() {
		return $this->operateTime;
	}

	public function getLogContent() {
		return $this->logContent;
	}

	public function setLogId($logId) {
		$this->logId = $logId;
	}

	public function setOperateUser($operateUser) {
		$this->operateUser = $operateUser;
	}

	public function setOperateTime($operateTime) {
		$this->operateTime = $operateTime;
	}

	public function setLogContent($logContent) {
		$this->logContent = $logContent;
	}
	
	public function toString(){
	   return "";
	}
}

interface LogFileOperateApi {
	abstract public function readLogFile();
	abstract public function writeLogFile();
}

class LogFileOperate implements LogFileOperateApi {
	
	public function __construct() {
		
	}
	
	public function readLogFile() {
		
	}

	public function writeLogFile() {
		
	}
}

class Client {
	public static function main() {
		$logModel = new LogModel();
		
		$list = array();
		$list[] = $logModel;
		
		$api = new LogFileOperate();
		$api->writeLogFile($list);
		
		$readLog = $api->readLogFile();
	}
}

수요 증가:
     
 
데이터 베 이 스 를 추가 하 는 방식 으로 로 그 를 기록 합 니 다.그리고 이전 버 전이 정상적으로 실 행 될 수 있 도록 해 야 합 니 다.
      로그 파일 을 파일 로 만 기록 하 는 것 이 라면 문제 가 없습니다.마음 에 드 시 는 것 도 쉽 죠? 하지만 한동안 사용 한 후에 시스템 업 그 레이 드 를 고려 하여 데이터 베 이 스 를 이용 하여 로 그 를 관리 하기 로 했 습 니 다.
interface LogDbOperateApi {
	abstract public function createLog();
	abstract public function updateLog();
	abstract public function removeLog();
	abstract public function getLog();
}

class LogDbOperate implements LogDbOperateApi {
	public function createLog() {}
	public function getLog() {}
	public function removeLog() {}
	public function updateLog() {}
}

이 때, 직면 해 야 할 문제:
      1. 새 시스템 에 있 는 2 판 로 그 는 1 판 로 그 를 사용 합 니 다.새 시스템 은 기 존 시스템 의 인터페이스 와 다 르 기 때문에 불가능 하기 때문에 새 시스템 은 같은 방식 으로 1 판 로그 행 위 를 직접 사용 할 수 없습니다.
      2. 가장 먼저 떠 오 르 는 해결 방법 은 1 면 을 다시 써 서 파일 에 쓰 는 실현 방식 이다.그러나 다른 기능 은 이전의 실현 에 의존 하여 직접 변경 하면 고장 이 날 수 있다.소스 코드 가 아예 안 보이면 요?
해결 방안:
어댑터 모드
어댑터 모드 의 코드:
interface Target {
	public function request();
}

class Adaptee {
	public function specificRequest() {
		//todo
	}
}

class Adapter implements Target {
	
	private $adaptee;
	
	public function __construct($adaptee) {
		$this->adaptee = $adaptee;
	}
	
	public function request() { 
		$this->adaptee->specificRequest();
	}
}

class Client {
	public static function main() {
		$adaptee = new Adaptee();
		$taget = new Adapter($adaptee);
		$taget->request();
	}
}

어댑터 모드 로 로그 시스템 구현:
 
(제2판)
class Adapter implements LogDbOperateApi {
	private $adaptee = null;
	
	public function __construct($adaptee) {
		$this->adaptee = $adaptee;
	}
	
	public function createLog() {
		// $this->adaptee     
	}
	public function getLog() {
		// $this->adaptee     
	}
	public function removeLog() {
		// $this->adaptee     
	}
	public function updateLog() {
		// $this->adaptee     
	}
}

class Client {
	public static function main() {
		$logModel = new LogModel();
		
		$list = array();
		$list[] = $logModel;
		
		$logFileApi = new LogFileOperate();
		$logDbApi = new Adapter($logFileApi);
		//todo $logDbApi       LogDbOperateApi     。
	}
}

어댑터 모드 설명:
       기능: 전환 매 칭 을 하 는 목적 은 기 존 기능 을 재 활용 하 는 것 이지 업 으로 새로운 인 터 페 이 스 를 실현 하 는 것 이 아 닙 니 다.
                  호 환 되 지 않 는 인 터 페 이 스 를 고객 이 원 하 는 스타일 로 바꾸다.

좋은 웹페이지 즐겨찾기