링크관리도 구현했으니 이제 디자인 패턴을 구현해본다.


디자인 패턴의 구현은 자동화 도구를 통한 소스생성과 컬레보레이션을 구현한 클래스라이브러리의 결합에 의해 가능하다. 여기에서는 어느 부분을 자동화 도구로 지원해야 하고, 어떤 부분이 구현된 라이브러리가 될 수 있는지를 구분해서 설명하도록 한다.

구현언어는 C#이다.


기본적인 내용은 책을 참조하고, 여기에서는 어떻게 자동화 도구로 디자인 패턴 구현을 자동화 할 것인지, 어떻게 컬레보레이션을 구현하는지에 집중하도록 하자.


1장. Iterator 패턴

컬렉션의 요소를 하나씩 열거하면서 처리한다.


컬렉션에서 요소를 얻는 방법

- 키를 통해(예: Hashtable)

- 컬렉션 내의 위치 정보를 통해(예: List)

- 처음부터 끝까지 하나씩 열거를 통해(Iterator)


Iterator는  컬렉션 내의 요소를 처음부터 차례로 스캔한다.

스캔 방법은 다음 요소가 있는지 확인 해 보고, 있으면 다음 요소를 얻는다.


Aggregate는 Iterator를 통해 요소를 얻는 방법을 제공하는 컬렉션이다. 즉, Iterator를 지원하는 컬렉션이 Aggregate이다.


Client에서는 Aggregate 컬렉션에게 Iterator를 요청하고, 이것을 사용해서 Aggregate가 포함하는 요소를 하나씩 열거할 수 있게 된다.


사용자 삽입 이미지

컬레보레이션 모델링
Iterator방식의 Aggregate의 처리를 하나의 컬레보레이션 관점에서 보면 다음과 같이 풀 수 있다.
1. 하나씩  열거하면서  처리한다는 것은 무슨 말인가?
1.1 무엇을 처리한다는 말인가? 컬렉션
1.2 무엇을 하나씩 열거한다는 말인가? 컬렉션이 포함한 모든 요소들
1.3 하나씩 열거한다는 말은?
컬렉션이 포함한 모든 요소들에 대해 순차적으로 하나씩 처리한다는 것
1.4 어떻게 처리한다는 것인가?
구체적인 처리는 결정되어 있지 않다.
 
Iterator 패턴을 컬레보레이션으로 표현하면 다음과 같다.
컬렉션의 모든 요소들에 대해 순차적으로 하나씩 열거하면서 Client가 정해준 방법으로 처리해라.
순차적으로 하나씩 열거하면서 처리해라(어떤 컬렉션, 어떤 핸들러)
 
Iteration 컬레보레이션은 아래 그림과 같이 Aggregate에 대해서 하나씩 열거하면서 핸들러에게 넘겨주어서 처리하도록 한다.
하나씩 열거할 수 있는 방법으로 Iterator가 hasNext와 next 오퍼레이션을 가진다.
 
다수의 핸들러들이 있을 수 있고, 역방향으로 열거하는 것도 가능하다.
Aggregate와 Handler사이의 연결 뒤에 컬레보레이션 오퍼레이션을 호출하는 것이 아니기 때문에 연결을 유지할 필요가 없다.
 
아래 그림은 정형화된 표현이 아니라, 개념적으로 표현한 것이다.
 
 
사용자 삽입 이미지
 
 
 
자동화 방법
1. 라이브러리
Iterator가  고유  행위(hasNext, next) 를  가지므로  인터페이스로  구현  가능
자바 또는 .NET의 컬렉션은 Iterator 를  리턴 하도록  구현되어  있다.
 
.NET 의  경우 foreach문으로 직접 iterator를 갖는 컬렉션을 열거할 수 있도록 지원
자바의  경우,  처리자에  해당하는  메소드를  전달할  다른  방법을  찾거나  설계/ 코드  생성  수준에서  자동화  한다.
 
2. 설계/ 코드  생성
- Aggregate, Iterator 는  인터페이스로
   hasNext, next,  클라이언트에서 iterator 를  사용하는  부분의  코드  생성
- 패턴요소  설정할  수  있는  폼  지원( 나머지  모든  자동화  방법에  동일  적용)
 
.NET에서는 컬렉션과 foreach문을 직접 사용하므로 위의 내용이 불필요하다.
이러한 방식으로 구현하면 컬렉션 처리 부분을 분리할 수 있게 된다.
 
Iteration 구현
 
    public delegate void Iterate(object element);
    public class Iteration
    {
        public event Iterate IterateHandler = null;       
       
        public void Iterate(ICollection collection, Iterate handler)
        {
            foreach (object element in collection)
            {
                handler(element);
            }
        }
        public void IterateWithHandlers(ICollection collection)
        {
            foreach (object element in collection)
            {
                if (IterateHandler != null) IterateHandler(element);
            }
        }
        public void ReverseIterate(ICollection collection, Iterate handler)
        {
            Stack reverseCollection = new Stack();
            foreach (object element in collection)
            {
                reverseCollection.Push(element);
            }
            foreach (object element in reverseCollection)
            {
                handler(element);
            }
        }
        public void ReverseIterateWithHandlers(ICollection collection)
        {
            Stack reverseCollection = new Stack();
            foreach (object element in collection)
            {
                reverseCollection.Push(element);
            }
            foreach (object element in reverseCollection)
            {
                if (IterateHandler != null) IterateHandler(element);
            }
        }
        public void Reset()
        {
            IterateHandler = null;
        }
    }
 
 
 
예제
1. 단일 핸들러에 의한 처리
    public class Book
    {
        private string _name = string.Empty;
        public Book(string name)
        {
            _name = name;
        }
        public string Name
        {
            get
            {
                return _name;
            }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList bookShelf = new ArrayList();
            bookShelf.Add(new Book("Around the World in 80 Days"));
            bookShelf.Add(new Book("Bible"));
            bookShelf.Add(new Book("Cinderella"));
            bookShelf.Add(new Book("Daddy-Long-Legs"));
            Iteration iteration = new Iteration();
            iteration.Iterate(bookShelf,new Iterate(WriteBookName));

            System.Console.Read();
        }
        public static void WriteBookName(object book)
        {
            System.Console.WriteLine(((Book)book).Name);
        }
    }
 
2. 다중 핸들러에 의한 처리
   
    public class Book
    {
        private string _name = string.Empty;
        private string _isbn = string.Empty;
        public Book(string name, string isbn)
        {
            _name = name;
            _isbn = isbn;
        }
        public string Name
        {
            get
            {
                return _name;
            }
        }
        public string ISBN
        {
            get
            {
                return _isbn;
            }
        }
    }
   
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList bookShelf = new ArrayList();
            bookShelf.Add(new Book("Around the World in 80 Days", "aaa"));
            bookShelf.Add(new Book("Bible","bbb"));
            bookShelf.Add(new Book("Cinderella", "ccc"));
            bookShelf.Add(new Book("Daddy-Long-Legs", "ddd"));
            Iteration iteration = new Iteration();
            iteration.IterateHandler +=new Iterate(WriteBookName);
            iteration.IterateHandler += new Iterate(WriteBookISBN);
            iteration.IterateWithHandlers(bookShelf);

            System.Console.Read();
        }
        public static void WriteBookName(object book)
        {
            System.Console.WriteLine(((Book)book).Name);
        }
        public static void WriteBookISBN(object book)
        {
            System.Console.WriteLine(((Book)book).ISBN);
        }
    }
신고
Posted by 나비 나비:D

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
----------------------------- (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

글 보관함

달력

«   2017/12   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
Total : 895,114
Today : 41 Yesterday : 231