디자인 모드 (7) 조합 모드 Composite (구조 형)

6776 단어
디자인 모드 (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

좋은 웹페이지 즐겨찾기