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 。
}
}
어댑터 모드 설명:
기능: 전환 매 칭 을 하 는 목적 은 기 존 기능 을 재 활용 하 는 것 이지 업 으로 새로운 인 터 페 이 스 를 실현 하 는 것 이 아 닙 니 다.
호 환 되 지 않 는 인 터 페 이 스 를 고객 이 원 하 는 스타일 로 바꾸다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 에 대한 인식 (1)대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 하여 하위 클래스 가 어떤 종 류 를 예화 할 지 결정 합 니 다.Factory Method 는 클래스 의 실례 화 를 하위 클래스 로 지연 시 킵 니 다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.