디자인 모드 (7) 조합 모드 Composite (구조 형)
1. 개술
데이터 구조 에서 나무 구 조 는 매우 중요 하기 때문에 우 리 는 나무의 구 조 를 디자인 모델 에 응용 할 수 있다.
예 1: 다단 계 트 리 메뉴 입 니 다.
예 2: 파일 과 폴 더 디 렉 터 리
2. 문제
우 리 는 간단 한 대상 을 복잡 한 대상 으로 조합 할 수 있 는데, 이 복잡 한 대상 은 더 큰 대상 으로 조합 할 수 있다.우 리 는 간단 한 대상 들 을 클래스 로 정의 한 후에 용기 류 를 정의 하여 이 간단 한 대상 들 을 저장 할 수 있다.클 라 이언 트 코드 는 대상 의 간단 한 대상 과 용기 대상 을 구별 해 야 하 며, 실제 대부분의 경우 사용자 들 은 그것들 이 같다 고 생각한다.이런 종류의 차 이 를 사용 하면 프로그램 이 더욱 복잡 해진 다.재 귀적 으로 사용 할 때 와 번 거 로 움, 우 리 는 어떻게 재 귀적 조합 을 사용 하여 사용자 가 이런 유형 을 구별 할 필요 가 없 게 합 니까?
3. 해결 방안
조합 모드: 대상 을 트 리 구조 로 조합 하여 '부분 - 전체' 의 차원 구 조 를 나타 낸다.Composite 는 사용자 가 하나의 대상 과 조합 대상 에 대한 사용 을 일치 시 킵 니 다.
때로는 부분 - 전체 모델 이 라 고도 부른다. 이것 은 우리 트 리 구조의 문제 에서 간단 한 요소 와 복잡 한 요소 의 개념 을 모호 하 게 한다. 고객 프로그램 은 간단 한 요 소 를 처리 하 는 것 처럼 복잡 한 요 소 를 처리 하여 고객 프로그램 과 복잡 한 요소 의 내부 구 조 를 결합 시 킬 수 있다.
조합 모드 는 재 귀 또는 등급 별 데이터 구 조 를 최적화 할 수 있 게 한다.등급 별 데이터 구조 에 관 한 예 가 많아 서 조합 모델 이 매우 유용 하 다.등급 별 데이터 구조 에 대한 보편적 인 예 는 컴퓨터 를 사용 할 때마다 만 나 는 파일 시스템 이다.파일 시스템 은 디 렉 터 리 와 파일 로 구성 되 어 있 습 니 다.모든 디 렉 터 리 에 내용 을 담 을 수 있다.디 렉 터 리 의 내용 은 파일 일 수도 있 고 디 렉 터 리 일 수도 있 습 니 다.이런 방식 에 따라 컴퓨터 의 파일 시스템 은 재 귀 구조 로 구성 된다.이러한 데이터 구 조 를 설명 하려 면 조합 모드 Composite 를 사용 할 수 있 습 니 다.
4. 조합 모드 의 분류
1) 하위 요 소 를 관리 하 는 방법 을 Composite 클래스 에 정의 합 니 다. 2) 하위 요 소 를 관리 하 는 방법 을 Component 인터페이스 에 정의 하면 Leaf 류 는 이러한 방법 을 비 워 야 합 니 다.
5. 적용 성
다음 상황 에서 Composite 모드 적용:
1). 대상 을 나타 내 고 싶 은 부분 - 전체적인 차원 구조
2). 사용자 가 조합 대상 과 하나의 대상 이 다 르 기 를 무시 하고 사용 자 는 조합 구조의 모든 대상 을 통일 적 으로 사용 하 기 를 바 랍 니 다.
6. 구조
전형 적 인 C o m p o s i t 대상 구 조 는 다음 과 같다.
7. 구축 모델 의 구성
추상 적 인 구조물 역할 (component): 조합 중의 대상 성명 인터페이스 로 적당 한 상황 에서 모든 종류의 공유 인터페이스 의 기본 행 위 를 실현 합 니 다.Component 하위 위 젯 에 접근 하고 관리 할 인 터 페 이 스 를 설명 합 니 다.
이 인 터 페 이 스 는 괜찮다 모든 하위 대상 을 관리 하 는 데 쓰 인 다.(선택 가능) 재 귀 구조 에서 인 터 페 이 스 를 정의 하여 부모 위 젯 에 접근 하고 적당 한 상황 에서 이 를 실현 합 니 다. 나뭇잎 부재 역할 (Leaf): 조합 나무 에서 잎 노드 대상 을 나타 내 고 잎 노드 에 서브 노드 가 없다.조합 에서 그림 의 대상 을 정의 하 는 행위 입 니 다.
나뭇가지 부재 역할 (Composite): 하위 위 젯 이 있 는 위 젯 의 행동 을 정의 합 니 다.메모리 하위 위 젯.Component 인터페이스 에서 하위 위 젯 과 관련 된 작업 을 수행 합 니 다.
클 라 이언 트 역할 (Client): component 인 터 페 이 스 를 통 해 조합 부품 의 대상 을 조종 합 니 다.
8. 효과
1) • 기본 대상 과 조합 대상 을 포함 하 는 클래스 구조의 기본 대상 은 더욱 복잡 한 조합 대상 으로 조 합 될 수 있 고 이 조합 대상 은 조 합 될 수 있어 끊임없이 귀 속 될 수 있 음 을 정의 했다.클 라 이언 트 코드 기본 대상 은 모두 조합 대상 을 사용 할 수 있다.
2) • 고객 코드 를 간소화 하면 고객 은 조합 구조 와 단일 대상 을 일치 하 게 사용 할 수 있다.일반적으로 사용 자 는 잎 노드 를 처리 하 는 지 조합 구성 요 소 를 처리 하 는 지 모른다.이것 은 조합 을 정의 하 는 클래스 에 선택 문 구 를 가득 채 우 는 함 수 를 쓸 필요 가 없 기 때문에 고객 코드 를 간소화 했다.
3) • 새로운 유형의 구성 요 소 를 쉽게 추가 할 수 있 도록 새로운 정 의 를 내 린 Composite 나 Leaf 서브 클래스 는 기 존의 구조 와 클 라 이언 트 코드 와 자동 으로 작 동 합 니 다. 클 라 이언 트 프로그램 은 새로운 Component 류 로 인해 변 하지 않 아 도 됩 니 다.
4) • 당신 의 디자인 을 더욱 일반화 시 키 고 새로운 구성 요 소 를 추가 하기 쉬 워 도 문제 가 생 길 수 있 습 니 다. 그것 은 조합 중의 구성 요 소 를 제한 하기 어렵 다 는 것 입 니 다.어떤 때 는 하나의 조합 이 특정한 구성 요소 만 있 기 를 바란다.Composite 를 사용 할 때 유형 시스템 에 의존 하여 이러한 제약 을 가 할 수 없고 실행 시간 에 검 사 를 해 야 합 니 다.
9. 실현
비교적 전형 적 인 예 는 트 리 메뉴 입 니 다.다단 계 전시, 이 메뉴 는 노드 를 무한 증가 시 킬 수 있 습 니 다.예 외 는 파일 옮 겨 다 니 기 등등 이다.
_name = $name;
}
public function add($component) {
$this->_items[$component->getName()] = $component;
}
public function remove($component) {
$key = array_search($component,$this->_items);
if($key !== false) unset($this->_items[$key]);
}
public function getItems() {
return $this->_items;
}
public function displayOperation() {
static $align = '|';
if($this->getItems()) {
//substr($align, strpos($align,));
$align .= ' _ _ ';
}else{
$align .='';
}
echo $this->_name, "
";
foreach($this->_items as $name=> $item) {
echo $align;
$item->displayOperation();
}
}
public function getName(){
return $this->_name;
}
}
/**
* (Leaf)
*
*/
class ItemLeaf extends MenuComponent
{
private $_name = null;
private $_url = null;
//public $_align = '----';
public function __construct($name,$url)
{
$this->_name = $name;
$this->_url = $url;
}
public function displayOperation()
{
echo '' , $this->_name, '
';
}
public function getName(){
return $this->_name;
}
}
class Client
{
public static function displayMenu()
{
$subMenu1 = new MenuComposite("submenu1");
$subMenu2 = new MenuComposite("submenu2");
$subMenu3 = new MenuComposite("submenu3");
$subMenu4 = new MenuComposite("submenu4");
$subMenu5 = new MenuComposite("submenu5");
/*
$item1 = new ItemLeaf("sohu","www.163.com");
$item2 = new ItemLeaf("sina","www.sina.com");
$subMenu4 = new MenuComposite("submenu4");
$subMenu1->add($subMenu4);
$subMenu4->add($item1);
$subMenu4->add($item2);
*/
$item3 = new ItemLeaf("baidu","www.baidu.com");
$item4 = new ItemLeaf("google","www.google.com");
$subMenu2->add($item3);
$subMenu2->add($item4);
$allMenu = new MenuComposite("AllMenu");
$allMenu->add($subMenu1);
$allMenu->add($subMenu2);
$allMenu->add($subMenu3);
$subMenu3->add($subMenu4);
$subMenu4->add($subMenu5);
$allMenu->displayOperation();
}
}
// menu
Client::displayMenu();
?>
10. 조합 모드 및 기타 관련 모드
1) 장식 모드 (Decorator 모드) 는 Composite 모드 와 함께 자주 사용 된다.장식 과 조합 을 함께 사용 할 때, 그것들 은
보통 공공 부류 가 있다.따라서 장식 은 Add, Remove, GetChild 작업 이 있 는 Component 인 터 페 이 스 를 지원 해 야 합 니 다.
2) Flyweight 모드 는 구성 요 소 를 공유 하지만 부모 위 젯 을 참조 할 수 없습니다.
3) (교체 기 모드) Itertor 는 Composite 를 옮 겨 다 닐 수 있 습 니 다.
4) (관찰자 모드) Visitor 는 Composite 와 L e a f 류 에 분포 해 야 할 조작 과 행 위 를 국부 화 합 니 다.
11. 총결산
조합 모드 는 클 라 이언 트 프로그램 과 복잡 한 요소 내부 구 조 를 결합 시 켜 클 라 이언 트 프로그램 이 간단 한 요 소 를 처리 하 는 것 처럼 복잡 한 요 소 를 처리 할 수 있 게 한다.
만약 에 계층 구 조 를 만 들 고 그 중에서 모든 요 소 를 똑 같은 방식 으로 대 할 수 있다 면 조합 모델 은 가장 이상 적 인 선택 이다.
다음으로 전송:https://www.cnblogs.com/iplus/archive/2012/05/03/4490230.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.