PHP設計モード——装飾器モード(decorator)


アクセラレータモードを使用してクラスを設計する目的は、既存の機能性を書き換える必要がなく、ベースクラスにインクリメンタル変化を適用することです.アクセラレータモードは、プライマリ・コード・ストリームに他のコード・ストリームに影響を及ぼさずに、1つ以上の変更または「修飾」ターゲット・オブジェクトのアクセラレータを直接挿入できるように構成されています.
コードの例:
この例では、アプリケーションは光ディスクを処理します.アプリケーションには、CDディスクにトラックを追加する方法と、CDトラックのリストを表示する方法が必要です. 
class CD {
	public $trackList;
	public function __construct() {
		$this->trackList = array();
	}
 
	public function addTrack($track) {
		$this->trackList[] = $track;
	}
 
	public function getTrackList() {
		$output = '';
		foreach ($this->trackList as $key => $value) {
			$output .= ($key + 1) . ") {$value} ";
		}
		return $output;
	}
}

コードは非常に簡単で、このCDオブジェクトを使用するには、次のコードを実行する必要があります.
$tracksFromExternalSource = array('What It Means', 'Brr', 'Goodbye');
$myCD = new CD();
foreach($tracksFromExternalSource as $track) {
	$myCD->addTrack($track);
}
print "This CD contains:" . $myCD->getTrackList();

この場合、需要は小さく変化します.この出力インスタンスに対してのみ、出力される各トラックは大文字でなければなりません.このような小さな変化では、ベースクラスを変更したり、継承を使用して親--子関係を作成したりするのではなく、デザイナ設計モードに基づいたオブジェクトを作成するのが最善です.
class CDTrackListDecoratorCaps {
	private $_cd;
 
	public function __construct(CD $cd) {
		$this->_cd = $cd;
	}
 
	public function makeCaps() {
		foreach($this->_cd->trackList as &$track){
			$track = strtoupper($track);
		}
	}
}

以下に示すように、既存のインスタンスにアクセラレータを追加するには、新しいCDTrackListDecoratorCapsクラスを追加する必要があります.
$myCD = new CD();
foreach($tracksFromExternalSource as $track) {
	$myCD->addTrack($track);
}
 
$myCDCaps = new CDTrackListDecoratorCaps($myCD);
$myCDCaps->makeCaps();
print "This CD contains the following tracks:" . $myCD->getTrackList();

プライマリ・コード・ストリームは、2行のコードを追加するだけで、この小さな変化を達成できます.
オブジェクト構造を変更せずに既存のオブジェクトの内容や機能性を少し変更するには、アクセラレータ設計モードを使用します.
 
原文:https://blog.csdn.net/aslackers/article/details/49275123