>백엔드 개발 >PHP 튜토리얼 >PHP 디자인 패턴 배우기 PHP는 복합 패턴(composite)_php 기술을 구현합니다.

PHP 디자인 패턴 배우기 PHP는 복합 패턴(composite)_php 기술을 구현합니다.

WBOY
WBOY원래의
2016-05-16 20:03:311245검색

1. 의도
부분-전체 계층을 나타내기 위해 개체를 트리 구조로 그룹화합니다. 복합을 사용하면 단일 개체와 복합 개체를 일관되게 사용할 수 있습니다.
Composite가 변경하는 것은 객체의 구조와 구성입니다.
2. 합성모드의 주인공
추상 컴포넌트(Component) 역할: 추상 역할은 조합에 참여하는 객체에 대한 인터페이스를 지정합니다. 적절한 경우 모든 클래스에 공통된 인터페이스의 기본 동작을 구현합니다. Component의 하위 구성 요소에 액세스하고 관리하기 위한 인터페이스를 선언합니다
리프 구성요소(Leaf) 역할: 은 조합의 리프 노드 개체를 나타내며 리프 노드에는 하위 노드가 없습니다. 컴포지션에서 기본 개체의 동작을 정의합니다.
트리 구성요소(복합) 역할: 스토리지 하위 구성요소. 하위 구성요소가 있는 구성요소의 동작을 정의합니다. Component 인터페이스의 하위 구성 요소와 관련된 작업을 구현합니다.
클라이언트: 컴포넌트 인터페이스를 통해 결합된 컴포넌트의 객체를 조작합니다
3. 합성모드의 장점과 단점
복합 모드의 장점
1. 고객 코드 단순화
2. 새로운 유형의 구성 요소를 더 쉽게 추가할 수 있습니다.

복합 패턴의 단점: 디자인을 보다 일반적으로 만들고 구성 요소를 추가하기 쉽게 만들면 조합에서 구성 요소를 제한하기 어렵다는 문제가 발생할 수도 있습니다
4. 합성 모드 적용 시나리오
1. 객체의 부분-전체 계층을 표현하고 싶습니다
2. 사용자가 복합 개체와 단일 개체 간의 차이를 무시하고 사용자가 복합 구조의 모든 개체를 균일하게 사용하기를 원합니다.
5. 합성 모드 및 기타 모드
데코레이터 패턴: 데코레이터 패턴은 Composite 패턴과 함께 사용되는 경우가 많습니다. 데코레이터를 구성과 함께 사용하는 경우 일반적으로 공통 상위 클래스를 갖습니다. 따라서 장식은 추가, 제거 및 getChild 작업을 통해 구성 요소 인터페이스를 지원해야 합니다
플라이웨이트 모드: 플라이웨이트 모드를 사용하면 구성요소를 공유할 수 있지만 더 이상 상위 위젯을 참조할 수 없습니다
반복자 모드: 복합을 탐색하는 데 Itertor를 사용할 수 있습니다
방문자 패턴: 방문자는 Composite 및 Leaf 클래스에 배포되어야 하는 작업과 동작을 현지화합니다.
6.안전한 합성 모드
Composite 클래스에서 하위 클래스 객체를 관리하는 데 사용되는 모든 메서드를 선언합니다. 이 접근 방식은 안전합니다. 리프형 개체에는 하위 클래스를 관리하는 메서드가 전혀 없기 때문에 클라이언트가 리프형 개체에 대해 이러한 메서드를 사용하면 프로그램에서 컴파일 타임에 오류가 발생합니다. 컴파일이 실패하더라도 런타임 오류는 발생하지 않습니다
단점은 리프 클래스와 복합 클래스의 인터페이스가 다르기 때문에 충분히 투명하지 않다는 것입니다.
7. 안전 합성 모드 구조도

8. 안전 합성 모드 PHP 예제

<&#63;php
/**
 * 抽象组件角色
 */
interface Component {
 
 /**
  * 返回自己的实例
  */
 public function getComposite();
 
 /**
  * 示例方法
  */
 public function operation();
}
 
/**
 * 树枝组件角色
 */
class Composite implements Component {
 private $_composites;
 
 public function __construct() {
  $this->_composites = array();
 }
 
 public function getComposite() {
  return $this;
 }
 
 /**
  * 示例方法,调用各个子对象的operation方法
  */
 public function operation() {
  echo 'Composite operation begin:<br />';
  foreach ($this->_composites as $composite) {
   $composite->operation();
  }
  echo 'Composite operation end:<br /><br />';
 }
 
 /**
  * 聚集管理方法 添加一个子对象
  * @param Component $component 子对象
  */
 public function add(Component $component) {
  $this->_composites[] = $component;
 }
 
 /**
  * 聚集管理方法 删除一个子对象
  * @param Component $component 子对象
  * @return boolean 删除是否成功
  */
 public function remove(Component $component) {
  foreach ($this->_composites as $key => $row) {
   if ($component == $row) {
    unset($this->_composites[$key]);
    return TRUE;
   }
  }
 
  return FALSE;
 }
 
 /**
  * 聚集管理方法 返回所有的子对象
  */
 public function getChild() {
  return $this->_composites;
 }
 
}
 
class Leaf implements Component {
 private $_name;
 
 public function __construct($name) {
  $this->_name = $name;
 }
 
 public function operation() {
  echo 'Leaf operation ', $this->_name, '<br />';
 }
 
 public function getComposite() {
  return null;
 }
}
 
 
/**
 * 客户端
 */
class Client {
 
 /**
  * Main program.
  */
 public static function main() {
  $leaf1 = new Leaf('first');
  $leaf2 = new Leaf('second');
 
  $composite = new Composite();
  $composite->add($leaf1);
  $composite->add($leaf2);
  $composite->operation();
 
  $composite->remove($leaf2);
  $composite->operation();
 }
 
}
 
Client::main();
&#63;>
위는

합성 모드를 구현하기 위해 PHP를 사용하는 코드입니다. 또한 합성 모드에 대한 몇 가지 개념적 차이가 있어 모든 분들의 학습에 도움이 되기를 바랍니다.

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