ホームページ  >  記事  >  バックエンド開発  >  PHP 設計パターン - アダプター パターン アダプター

PHP 設計パターン - アダプター パターン アダプター

WBOY
WBOYオリジナル
2016-07-29 09:14:50981ブラウズ

アプリケーションでは、文書化されたコード ベースを使用している可能性がありますが、多くの場合、既存の オブジェクト をさまざまな方法で使用する必要がある新しい機能を追加する必要があります。おそらく、新機能には別の名前が必要なだけかもしれません。あるいは、新機能には元の オブジェクト とはわずかに異なる動作が必要である可能性があります。

上記の問題を解決するには、アダプター モードを使用するのが良い解決策です。アダプター パターンを使用して、別の オブジェクト を作成します。このアダプターオブジェクト は、元のアプリケーションと新しい機能の間の仲介者として機能します。アダプター デザイン パターン は、特定の オブジェクト のインターフェースを、別の オブジェクト が期待するインターフェースに単純に適合させます。

コード例:

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 の形式では、最初の列が数値のエラー コードで、2 番目の列がエラー テキストである必要があります。新しい要件では、ログを実装するコードが指定されていますが、問題は、コードが現在使用されているものとは異なる別のバージョンの errorObject に基づいて記述されていることです。新しい errorObject クラスには、getErrorNumber() と getErrorText() という名前の他の 2 つのメソッドがあり、logToCSV クラスで使用されます。
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);
	}
}
この問題に対処するには、次の 2 つの解決策を採用できます。

● 既存のコード ベースの errorObject クラスを作成します。

● アダプター クラスを作成します。

これらのパブリック インターフェイスの標準化を維持する必要性を考慮すると、アダプター オブジェクト を作成することが最善の解決策です。

既存の errorObject の機能が新しく作成されたアダプター object に存在する必要があり、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();

ある オブジェクトのインターフェースを別の オブジェクトに変換する必要がある場合、Adapterobjectを実装することはベストプラクティスであるだけでなく、多くのトラブルを節約することもできます。

アダプター モードの一般的な使用シナリオ:

● データベース ドライバー (各フレームワークのドライバー ソース コードを表示できます)

● Web サービス (複数の異なる Web サービスでアダプターを使用します)

上記は、PHP の設計パターン - アダプター パターンを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。