자바 디자인 모드 의 [조합 모드]

요약:
1. 조합 모드 는 트 리 구조 에 대한 작업 에 적 용 됩 니 다. 예 를 들 어 모든 권한 트 리 를 재 귀적 으로 검사 하고 재 귀적 으로 권한 트 리 를 삭제 하 는 등 입 니 다.
2. 추상 적 인 서브 노드 의 경우 예 를 들 어 1 에서 잎 결점 (파일) 과 비 잎 결점 (디 렉 터 리) 은 일치 하지 않 는 행위 가 있다. 예 를 들 어 파일 은 디 렉 터 리 를 추가 할 수 없다. 이런 상황 에서 하나의 인 터 페 이 스 를 설명 하고 1 개의 잎 결점 실현 류 와 1 개의 비 잎 결점 실현 류 를 조합 하여 대상 트 리 의 데이터 구 조 를 조합 해 야 한다.그러나 예 2 중 부서 의 행 위 는 완전히 일치 하기 때문에 예 2 는 조합 모델 의 변종 이 라 고 할 수 있 고 그의 디자인 사상 을 흡수 했 지만 실현 은 더욱 간결 하 다!!
3. 방문 자 모드 와 어 울 려 사용 하기 좋 은 천연
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
예 1: 파일 디 렉 터 리 와 파일 의 트 리 구 조 를 실현 합 니 다.
추상 클래스: 노드


/**
 *                ,             ,               ,                  
 */
public abstract class Node {
    protected String name;//  
    //     
    public Node(String name){
        this.name = name;
    }
    //    :        ,         
    public void addNode(Node node) throws Exception{
        throw new Exception("Invalid exception");
    }
    //    :           
    abstract void display();
}

:Filter



/**
 *       
 */
public class Filer extends Node {
    //            
    public Filer(String name) {
        super(name);
    }
    //      
    @Override
    public void display() {
        System.out.println(name);
    }
}

  :Noder



import java.util.*;
/**
 *       
 */
public class Noder extends Node {
    List nodeList = new ArrayList();//      (         )
    //              
    public Noder(String name) {
        super(name);
    }
    //    
    public void addNode(Node node) throws Exception{
        nodeList.add(node);
    }
    //          
    @Override
    void display() {
        System.out.println(name);
        for(Node node:nodeList){
            node.display();
        }
    }
}

:Clienter 



import java.io.File;
 
public class Clienter {
    public static void createTree(Node node) throws Exception{
        File file = new File(node.name);
        File[] f = file.listFiles();
        for(File fi : f){
            if(fi.isFile()){
                Filer filer = new Filer(fi.getAbsolutePath());
                node.addNode(filer);
            }
            if(fi.isDirectory()){
                Noder noder = new Noder(fi.getAbsolutePath());
                node.addNode(noder);
                createTree(noder);//         
            }
        }
    }
    public static void main(String[] args) {
        Node noder = new Noder("E://ceshi");
        try {
            createTree(noder);
        } catch (Exception e) {
            e.printStackTrace();
        }
        noder.display();
    }
}

      :

E://ceshi
E:\ceshi\  1.txt
E:\ceshi\  1
E:\ceshi\  1\  2.txt
E:\ceshi\  1\  3
E:\ceshi\  2
E:\ceshi\  2\  3.txt

2:


public class CompositePatternDemo {
	
	public static void main(String[] args) {
		Department leafDept1 = new Department("    1"); 
		Department leafDept2 = new Department("    2");
		Department leafDept3 = new Department("    3"); 
		
		Department subDept1 = new Department("   1");
		subDept1.getChildren().add(leafDept1);
		subDept1.getChildren().add(leafDept2);
		
		Department subDept2 = new Department("   2"); 
		subDept2.getChildren().add(leafDept3);
		
		Department parentDept = new Department("   ");
		parentDept.getChildren().add(subDept1);
		parentDept.getChildren().add(subDept2);
		
		parentDept.remove();
		
		//          ,          ,    ,        ,            
		//          ,                  ,                        
		
		//     ,  ,   ,     ,        ,                
		//           ,     
		//            ,          
	}
	
	public static class Department {
		
		private String name;
		private List children = new ArrayList();
		
		public Department(String name) {
			super();
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public List getChildren() {
			return children;
		}
		public void setChildren(List children) {
			this.children = children;
		}
		
		public void remove() {
			if(children.size() > 0) {
				for(Department child : children) {
					child.remove();
				}
			}
			System.out.println("    【" + name + "】");  
		}
		
	}
	
}

 


    :

    【    1】
    【    2】
    【   1】
    【    3】
    【   2】
    【   】

 

좋은 웹페이지 즐겨찾기