EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 2명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·Sorting Algorithm Animation (2)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

DesignPattern(c#) - Composite
글쓴이: EzDoum 글쓴날: 2005년 05월 02일 오후 08:02





# 정의 : 부분과 전체의 계층을 표현하기 위해 객체의 컬렉션을 트리구조로 만든다. Composite 패턴은 클라이언트로 하여금 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있도록 한다.
# 활용 : 부분-집합 관계의 계층도를 표현해야 하고, 복합 관계와 단일 객체 간의 사용 방법에 차이를 두고 싶지 않을 때 사용한다.
# 객체
  • Component
    - 집합 관계에 정의될 모든 객체에 대한 인터페이스를 정의한다.
    - 모든 클래스에 해당하는 인터페이스에 대해서는 공통의 행위를 구현한다.
    - 전체 클래스에 속한 요소들을 관리하는데 필요한 인터페이스를 정의한다.
    - 순환 구조에서 요소들을 포함하는 전체 클래스로의 접근에 필요한 인터페이스를 정의한다.
  • Leaf
    - 집합 관계에서의 다른 객체를 포함할 수는 없고 포함되기만 하는 객체
  • Composite
    - 포함된 요소들을 갖는 복합 객체에 대한 행위를 정의
    - 자신이 합성하고 있는 요소들을 저장하고 있으면서, 각 합성요소를 다루는데 관련된 오퍼레이션을 구현
  • Client
    - Componet 인터페이스를 통해 집합 관계에 있는 객체들을 관리한다.
    # 예제
  • 학교의 구성원이 교수, 학생, 교직원이고 학생은 학부생, 대학원생, 졸업생으로 구성되는 트리 구조를 Composite 패턴을 이용하여 프로그래밍하는 예제이다. 그리고 “방문자”라는 새로운 구성원을 추가하고 삭제하는 방법을 보여주고 있다. 이 패턴을 사용하게 되면 학생이라는 복합 객체와 교수, 교직원과 같은 단순 객체를 동일한 방법으로 표현할 수 있고 취급할 수 있는 장점이 있으며, 새로운 복합객체 또는 단순객체를 추가 삭제 하기가 용이하다.
     
    using System;
    using System.Text;
    using System.Collections;
    
    public abstract class Component
    {
    	// Fields
    	protected string name;
    
    	// Constructors
    	public Component(string name)
    	{
    		this.name = name;
    	}
    
    	// Methods
    	public abstract void Add(Component c);
    	public abstract void Remove(Component c);
    	public abstract void Operation(int depth );
    }
    
    public class Composite: Component 
    {
    	// Fields
    	private ArrayList componentList = new ArrayList();
    
    	// Constructors
    	public Composite( string name ) : base( name ) {}
    
    	public override void Operation(int depth )
    	{
    		Console.WriteLine( new String( '-', depth ) + name );
    		foreach(Component current in componentList)
    		{
    			current.Operation(depth + 2) ;
    		}
    	}
    
    	public override void Add(Component component)
    	{
    		componentList.Add(component);
    	}
    
    	public override void Remove(Component component)
    	{
    		componentList.Remove(component);
    	}
    }
    
    public class Leaf: Component 
    {
    	// Constructors
    	public Leaf( string name ) : base( name ) {}
    
    	// Methods
    	public override void Add( Component c )
    	{
    		Console.WriteLine("Cannot add to a leaf");
    	}
    
    	public override void Remove( Component c )
    	{
    		Console.WriteLine("Cannot remove from a leaf");
    	}
    
    	public override void Operation(int depth )
    	{
    		Console.WriteLine( new String( '-', depth ) + name );
    	}
    }
    
    public class Client
    {
    	public static void Main( string[] args )
    	{
    		// Create a tree structure
    		Composite root = new Composite( "학교" );
    		root.Add( new Leaf( "교수" ));
    
    		Composite comp = new Composite( "학생" );
    		comp.Add( new Leaf( "학부생" ) );
    		comp.Add( new Leaf( "대학원생" ) );
    		comp.Add( new Leaf( "졸업생" ) );
    		root.Add( comp );
    
    		root.Add( new Leaf( "교직원" ));
    
    		// Add and remove a leaf
    		Leaf l = new Leaf( "방문자" );
    		root.Add( l );
    		root.Remove( l );
    
    		// Recursively display nodes
    		root.Operation(1);
    	}
    }
    

  • 첨부 파일: dp_composite.jpg dp_composite.jpg (33 KiB(34,289 Bytes))

    [Image Size 801 x 525]
    dp_composite.jpg



    [분류: .NET 인쇄용 페이지 본문 email로 보내기 ]

  • <  Class 다루기 (상속,오버로딩,오버라이딩) | DesignPattern(c#) - Iterator  >
    DesignPattern(c#) - Composite | 답장: 1개 | 본문에 답장
    정렬 :  
    답장 EzDoum 2005년 05월 02일 오후 08:30 [ 이글에 답장 | 본문에 답장 | 책갈피 ]
    다른 추가적인 예!
    
    /******************************************************************************/
    /* ver 1 */
    /******************************************************************************/
    
    using System;
    using System.Collections;
    
    namespace Exam3
    {
    	class DrawingElement
    	{
    		protected string name;
    
    		public DrawingElement(string name)
    		{
    			this.name = name;
    		}
    		public void Add(DrawingElement d) {}
    		public void Remove(DrawingElement d) {}
    		
    		public void Display(int indent) {} //추가
    	}
    
    	class PrimitiveElement : DrawingElement
    	{
    		public PrimitiveElement(string name) : base(name) {}
    		new public void Add(DrawingElement c)
    		{
    			Console.WriteLine("추가할 수 없음");
    		}
    		new public void Remove(DrawingElement c)
    		{
    			Console.WriteLine("제거할 수 없음");
    		}
    
    		new public void Display(int indent) //내용 추가
    		{
    			//빈칸을 채우시오
    			Console.WriteLine(new String('-', indent) + " + " + name);
    		}
    		
    	}
    
    	class CompositeElement : DrawingElement
    	{
    		private ArrayList elements = new ArrayList();
    		public CompositeElement( string name ) : base( name ) {}
    		new public void Add( DrawingElement d )
    		{
    			elements.Add( d );
    		}
    		new public void Remove( DrawingElement d )
    		{
    			elements.Remove( d );
    		}
    		new public void Display(int indent)
    		{
    			Console.WriteLine(new String('-', indent) + " + " + name);
    			//각 노드의 자식 요소를 foreach를 사용하여 출력
    			//자식 요소를 각각의 원래 클래스 타입에 맞도록
    			//unboxing 시킨 후 메소드 호출
    			foreach( object item in elements) 
    			{
    				//빈칸을 채우시오
    				if(item.GetType().Name == "CompositeElement") 
    				{
    					((CompositeElement)item).Display(indent + 2);
    				}
    				else if(item.GetType().Name == "PrimitiveElement") 
    				{
    					((PrimitiveElement)item).Display(indent + 2);
    				}
    			}
    		
    			
    		}
    	}
    	
    	public class Ex3
    	{
    		public static void Main()
    		{
    			/* 트리 형태의 그림구조를 만듬, 아래 코드의 최종 형태는
    			"빨간 직선", "파란 원", "녹색 상자", "원 2개"를 자식 요소로 가지는
    			root가 생성되고 "원 2개"는 "검은 원", "흰 원"으로 구성됨 */
    			CompositeElement root = new CompositeElement("그림");
    			root.Add(new PrimitiveElement("빨간 직선"));
    			root.Add(new PrimitiveElement("파란 원"));
    			root.Add(new PrimitiveElement("녹색 상자"));
    	
    			CompositeElement comp = new CompositeElement("원 2개");
    			comp.Add(new PrimitiveElement("검은 원"));
    			comp.Add(new PrimitiveElement("흰 원"));
    			root.Add(comp);
    	
    			// PrimitiveElement를 추가 또는 제거
    			PrimitiveElement p = new PrimitiveElement("노란 직선");
    			root.Add(p);
    			root.Remove(p);
    	
    			// CompositeElement를 출력
    			root.Display(1);
    		}
    	}
    }
    
     
    /******************************************************************************/
    /* ver 2 */
    /******************************************************************************/
    using System;
    using System.Collections;
    
    namespace Exam3
    {
    	abstract class DrawingElement
    	{
    		protected string name;
    		public DrawingElement(string name)
    		{
    			this.name = name;
    		}
    		abstract public void Add(DrawingElement d);
    		abstract public void Remove(DrawingElement d);
    		virtual public void Display(int indent) {}
    	}
    
    	class PrimitiveElement : DrawingElement
    	{
    		public PrimitiveElement(string name) : base(name) {}
    		override public void Add(DrawingElement c)
    		{
    			Console.WriteLine("추가할 수 없음");
    		}
    		override public void Remove(DrawingElement c)
    		{
    			Console.WriteLine("제거할 수 없음");
    		}
    		override public void Display(int indent) //내용 추가
    		{
    			//빈칸을 채우시오
    			Console.WriteLine(new String('-', indent) + " + " + name);
    		}
    		
    	}
    
    	class CompositeElement : DrawingElement
    	{
    		private ArrayList elements = new ArrayList();
    		public CompositeElement( string name ) : base( name ) {}
    		override public void Add( DrawingElement d )
    		{
    			elements.Add( d );
    		}
    		override public void Remove( DrawingElement d )
    		{
    			elements.Remove( d );
    		}		
    		override public void Display(int indent)
    		{
    			Console.WriteLine(new String('-', indent) + " + " + name);
    			//각 노드의 자식 요소를 foreach를 사용하여 출력
    			//자식 요소를 각각의 원래 클래스 타입에 맞도록
    			//unboxing 시킨 후 메소드 호출
    			foreach( DrawingElement item in elements) 
    			{
    				item.Display(indent + 2);
    			}
    		}
    	}
    	public class Ex3
    	{
    		public static void Main()
    		{
    			/* 트리 형태의 그림구조를 만듬, 아래 코드의 최종 형태는
    			"빨간 직선", "파란 원", "녹색 상자", "원 2개"를 자식 요소로 가지는
    			root가 생성되고 "원 2개"는 "검은 원", "흰 원"으로 구성됨 */
    			CompositeElement root = new CompositeElement("그림");
    			root.Add(new PrimitiveElement("빨간 직선"));
    			root.Add(new PrimitiveElement("파란 원"));
    			root.Add(new PrimitiveElement("녹색 상자"));
    
    			CompositeElement comp = new CompositeElement("원 2개");
    			comp.Add(new PrimitiveElement("검은 원"));
    			comp.Add(new PrimitiveElement("흰 원"));
    			root.Add(comp);
    
    			// PrimitiveElement를 추가 또는 제거
    			PrimitiveElement p = new PrimitiveElement("노란 직선");
    			root.Add(p);
    			root.Remove(p);
    
    			// CompositeElement를 출력
    			root.Display(1);
    		}
    	}
    }
    



    [수정]

    DesignPattern(c#) - Composite | 답장: 1개 | 본문에 답장
    정렬 :  

    답장 쓰기
    글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

    검색
    Google

    분류
    ·공지 (6)
    ·인터넷 (87)
    ·하드웨어 (260)
    ·C/C++ (65)
    ·어셈블리 (7)
    ·리눅스 (136)
    ·리눅스 커널 (67)
    ·윈도우즈 (25)
    ·데이터베이스 (20)
    ·보안 (16)
    ·.NET (25)
    ·그래픽 (13)
    ·책소개 (42)
    ·호기심 천국 (80)
    ·잡담 (111)
    ·사랑 (3)

    전체 본문수: 963
    전체 답장수: 525


    분류 : .NET
    최근글
    최근글
    가장 많이 읽은 글
    ·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
    뜨거운 감자
    ·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)

    EzDoum투표
    이지도움 어때요?
    이게 뭐야. 다시 안올란다. --;
    아이 좋아라~ +_+;
    관심없다.
    먼가는 있는거 같은데 뭐하는 곳이지?
    기타 (자유게시판에 글로 남겨 주세요)
    [ 결과 | 투표 ]

    랜덤 링크
    http://kldp.net


     Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
     Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum