>백엔드 개발 >PHP 튜토리얼 >나무와 같은 복합 패턴

나무와 같은 복합 패턴

巴扎黑
巴扎黑원래의
2016-11-12 14:08:451535검색

회사는 일하는 구성원들로 구성됩니다. 각 구성원은 서로 다른 속성(이름, 직위, 급여)을 가지며 서로 다른 수준에 따라 트리 구조를 형성합니다. General Manager는 상사가 없기 때문에 이 트리의 루트 노드입니다. 부서 관리자는 상사와 부하가 모두 있기 때문에 분기 노드입니다. Minion은 가장 낮은 수준의 열심히 일하는 사람이고 부하가 없기 때문에 리프 노드입니다. . 이제 조합 모드를 사용하여 이 트리를 표시합니다.

나무와 같은 복합 패턴

코드는 다음과 같습니다.

<?php
abstract class Corp {
private $name = &#39;&#39;;
private $position = &#39;&#39;;
private $salary = 0;
public function __construct( $name, $position, $salary ) {
$this->name = $name;
$this->position = $position;
$this->salary = $salary;
}
public function getInfo() {
$return = "姓名:".$this->name."\t";
$return .= "职位:".$this->position."\t";
$return .= "薪水:".$this->salary."\n";
return $return;
}
}
class Leaf extends Corp{
}
class Branch extends Corp{
private $subordinateList = array();
public function addSubordinate(Corp $corp){
array_push($this->subordinateList, $corp);
}
public function getSubordinateList(){
return $this->subordinateList;
}
}
$root = new Branch(&#39;马总&#39;,&#39;总经理&#39;,100000);
$branch1 = new Branch(&#39;罗总&#39;,&#39;研发部门经理&#39;,20000);
$branch2 = new Branch(&#39;高总&#39;,&#39;销售部门经理&#39;,80000);
$leaf1 = new Leaf(&#39;张三&#39;,&#39;开发人员&#39;,7000);
$leaf2 = new Leaf(&#39;李四&#39;,&#39;开发人员&#39;,8000);
$leaf3 = new Leaf(&#39;二蛋&#39;,&#39;销售人员&#39;,10000);
$leaf4 = new Leaf(&#39;狗子&#39;,&#39;销售人员&#39;,15000);
$root->addSubordinate($branch1);
$branch1->addSubordinate($leaf1);
$branch1->addSubordinate($leaf2);
$root->addSubordinate($branch2);
$branch2->addSubordinate($leaf3);
$branch2->addSubordinate($leaf4);
function getTreeInfo($branch){
echo $branch->getInfo();
$subordinateList = $branch->getSubordinateList();
foreach ($subordinateList as $value) {
if($value instanceof Branch){
getTreeInfo($value);
}else{
echo $value->getInfo();
}
}
}
getTreeInfo($root);
?>

실행 결과:

이름: Mr. Ma 직위: 총괄 관리자 급여: 100000

이름: Mr. Luo 직위: R&D 부서 관리자 급여: 20000

이름: Zhang San 직위: 개발자 급여: 7000

이름: Li Si 직위: 개발자 급여: 8000

이름: Mr. Gao 직위: 영업부서 관리자 급여: 80000

이름: Erdan 직위: 영업사원 급여: 10000

이름 : 고우지 직위 : 영업사원 급여 : 15,000

[0.1초만에 완료]

조합 모드의 정의

조합 모드는 합성 모드라고도 하는데, 또한 부분-전체 모형이라고도 하며 부분과 전체의 관계를 설명하는 데 주로 사용됩니다. 이는 "부분-전체" 계층 구조를 나타내기 위해 개체를 트리 구조로 결합하여 사용자가 단일 개체와 결합된 개체를 일관되게 사용할 수 있도록 정의됩니다. 조합 모드는 크게 세 가지 역할로 구성됩니다

1. 컴포넌트 추상 컴포넌트 역할

은 결합된 객체의 공통 메소드와 속성을 정의하고 Corp와 같은 일부 기본 동작이나 속성을 정의할 수 있습니다. 예시 종류에서는요.

2. Leaf 컴포넌트

3. Composite Branch 컴포넌트

브랜치 노드와 리프 노드를 결합하여 트리 구조를 형성

조합 모드의 장점

1. 상위 모듈 호출은 간단합니다

트리 구조의 모든 노드는 호출자에게 로컬 부분과 전체 사이에 차이가 없습니다. 모듈은 신경 쓸 필요가 없습니다. 단일 객체를 다루든 전체 결합 구조를 다루든 이는 상위 수준 모듈의 코드를 단순화합니다.

2. 노드가 스스로 추가됩니다.

확장이 매우 쉽고 열기 및 닫기 원칙을 따릅니다.

조합 모드의 단점

조합 모드에는 매우 명백한 단점이 있습니다. 장면 클래스의 정의를 참조하세요. 나뭇잎과 가지를 사용할 때 정의를 언급했습니까? 구현 클래스가 직접 사용됩니다! 이는 인터페이스 지향 프로그래밍에서는 매우 부적절하고 종속성 위임 원칙과 충돌하며 인터페이스의 영향 범위를 제한합니다.

조합 모드의 활용 시나리오

1. 트리 메뉴, 파일, 폴더 관리 등 부분-전체 관계를 유지하고 표시하는 시나리오.

2. 총 가격 모듈이나 기능이 전체와 독립적으로 분리될 수 있는 시나리오.

조합 모드 주의사항

트리 구조인 만큼, 조합 모드 사용을 고려하셔야 한다는 점을 반영하기 위한 것입니다. 지역과 전체 관계가 있고 그 관계가 상대적으로 깊다면 결합 모델을 고려해야 합니다.

조합 모드 확장

1. 실제 조합 모드(생략)

2. 투명 조합 모드

예제는 안전한 조합 모드, 투명 모드는 조합에 사용되는 메소드를 추상 클래스에 넣는 것입니다(skip)

3. 조합 모드의 순회

예제에서는 트리를 상위 레벨에서 하위 레벨로 순회합니다. 리프 노드를 무작위로 선택하는 경우 상위 레벨로 이동하는 방법은 무엇입니까?

나무와 같은 복합 패턴

실제로는 매우 간단합니다. 노드를 추가할 때 상위 노드를 설정하면 됩니다.

<?php
abstract class Corp {
private $name = &#39;&#39;;
private $position = &#39;&#39;;
private $salary = 0;
<strong>private $parent = null;</strong>
public function __construct( $name, $position, $salary ) {
$this->name = $name;
$this->position = $position;
$this->salary = $salary;
}
public function getInfo() {
$return = "姓名:".$this->name."\t";
$return .= "职位:".$this->position."\t";
$return .= "薪水:".$this->salary."\n";
return $return;
}
<strong>public function setParent($parent){
$this->parent = $parent;
}
public function getParent(){
return $this->parent;
}</strong>
}
class Leaf extends Corp{
}
class Branch extends Corp{
private $subordinateList = array();
public function addSubordinate(Corp $corp){
<strong>$corp->setParent($this);</strong>
array_push($this->subordinateList, $corp);
}
public function getSubordinateList(){
return $this->subordinateList;
}
}
$root = new Branch(&#39;马总&#39;,&#39;总经理&#39;,100000);
$branch1 = new Branch(&#39;罗总&#39;,&#39;研发部门经理&#39;,20000);
$branch2 = new Branch(&#39;高总&#39;,&#39;销售部门经理&#39;,80000);
$leaf1 = new Leaf(&#39;张三&#39;,&#39;开发人员&#39;,7000);
$leaf2 = new Leaf(&#39;李四&#39;,&#39;开发人员&#39;,8000);
$leaf3 = new Leaf(&#39;二蛋&#39;,&#39;销售人员&#39;,10000);
$leaf4 = new Leaf(&#39;狗子&#39;,&#39;销售人员&#39;,15000);
$root->addSubordinate($branch1);
$branch1->addSubordinate($leaf1);
$branch1->addSubordinate($leaf2);
$root->addSubordinate($branch2);
$branch2->addSubordinate($leaf3);
$branch2->addSubordinate($leaf4);
function getParentInfo($leaf){
echo $leaf->getInfo();
$parent = $leaf->getParent();
if($parent instanceof branch)
getParentInfo($parent);
}
getParentInfo($leaf4);
?>

실행 결과:

이름: Gouzi 직위: 영업사원 급여: 15,000

이름: Mr. Gao 직위: 영업부 과장 급여: 80,000

이름: Mr. Ma 직위: 부장 급여: 100,000

[0.2초 만에 완료]

코드에서 굵은 글씨로 표시된 부분은 이전 예시와의 차이점입니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.