免責事項: この一連のブログの参考資料は、Cheng Jie 著の「Dahua Design Pattern」です。
結合モード (部分-全体モードとも呼ばれます) は、オブジェクトをツリー構造に結合して、「部分-全体」階層を表します。合成パターンにより、ユーザーは単一オブジェクトと複合オブジェクトを一貫して使用できます。これにより、ツリー構造の問題における単純な要素と複雑な要素の概念が曖昧になります。クライアント プログラムは、複雑な要素を単純な要素と同じように処理できるため、クライアント プログラムが複雑な要素の内部構造から切り離されます。
実装クラス図:
3 つの主要な役割:
抽象構造 (Company) 役割: この役割は、すべてのクラスに共通のインターフェイスのデフォルト動作を実装し、インターフェイス管理サブコンポーネントを宣言します。
リーフノード(テクノロジー)役割:リーフオブジェクトを表し、子ノードを持ちません。サブカンパニー文字: ADD()など、サブコンポーネントに関連する操作を実現するためにサブコンポーネントを格納するために使用されます。
代 実装コード:
<?php/** * Created by PhpStorm. * User: Jiang * Date: 2015/5/2 * Time: 21:14 *//**抽象结构角色 公司 * Class Company */abstract class Company{ protected $name; function __construct($name) { $this->name=$name; } /**增加 * @param Company $company 子公司,部门 * @return mixed */ abstract function Add(Company $company); /**移除 * @param Company $company 子公司,部门 * @return mixed */ abstract function Remove(Company $company); /**显示公司及部门结构 * @param $depth * @return mixed */ abstract function Display($depth);}/**枝节点 子公司 * Class Beijing */class SubCompany extends Company{ private $sub_companys=array(); function __construct($name) { parent::__construct($name); } function Add(Company $company) { $this->sub_companys[]=$company; } function Remove(Company $company) { $key=array_search($company,$this->sub_companys); if($key!==false) { unset($this->sub_companys[$key]); } } function Display($depth) { $pre=""; for($i=0;$i<$depth;$i++) { $pre.="-"; } $pre.=$this->name."<br/>"; echo $pre; foreach($this->sub_companys as $v) { $v->Display($depth+2); } }}/**叶子节点 财务部 * Class DeptCompany */class MoneyDept extends Company{ function __construct($name) { parent::__construct($name); } /**增加 * @param Company $company 子公司,部门 * @return mixed */ function Add(Company $company) { echo "叶子节点,不能继续添加节点。。。。。。。。。。<br/>"; } /**移除 * @param Company $company 子公司,部门 * @return mixed */ function Remove(Company $company) { echo "叶子节点,不能删除节点。。。。。。。。。。<br/>"; } /**显示公司及部门结构 * @param $depth * @return mixed */ function Display($depth) { $pre=""; for($i=0;$i<$depth;$i++) { $pre.="-"; } $pre.=$this->name."<br/>"; echo $pre; }}/**叶子节点 技术部门 * Class DeptCompany */class TechnologyDept extends Company{ function __construct($name) { parent::__construct($name); } /**增加 * @param Company $company 子公司,部门 * @return mixed */ function Add(Company $company) { echo "叶子节点,不能继续添加节点。。。。。。。。。。<br/>"; } /**移除 * @param Company $company 子公司,部门 * @return mixed */ function Remove(Company $company) { echo "叶子节点,不能删除节点。。。。。。。。。。<br/>"; } /**显示公司及部门结构 * @param $depth * @return mixed */ function Display($depth) { $pre=""; for($i=0;$i<$depth;$i++) { $pre.="-"; } $pre.=$this->name."<br/>"; echo $pre; }}
利点:
組み合わせモード再帰的またはグレーディング データ構造の処理を最適化できます。構成パターンを非常に便利にする階層データ構造の例は数多くあります。階層データ構造の一般的な例は、コンピューターを使用するたびに遭遇するもの、つまりファイル システムです。ファイル システムはディレクトリとファイルで構成されます。各ディレクトリにはコンテンツを含めることができます。ディレクトリの内容はファイルまたはディレクトリになります。このようにして、コンピュータのファイル システムは再帰的な構造で編成されます。このようなデータ構造を記述したい場合は、複合パターンを使用できます。