Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
study:java:design_pattern:composite [2008/09/14 08:33] – banana | study:java:design_pattern:composite [2008/09/14 09:08] (現在) – banana | ||
---|---|---|---|
行 201: | 行 201: | ||
나타난다면 그 메뉴에서 또 다른 반복잡업을 실행하게 됩니다. 서브 메뉴가 여러 단계로 중첩되어 있으면 그런 과정이 | 나타난다면 그 메뉴에서 또 다른 반복잡업을 실행하게 됩니다. 서브 메뉴가 여러 단계로 중첩되어 있으면 그런 과정이 | ||
여러번 반복되겠죠. | 여러번 반복되겠죠. | ||
+ | |||
+ | |||
行 229: | 行 231: | ||
} | } | ||
return component; | return component; | ||
- | } else [ | + | } else { |
return null; | return null; | ||
} | } | ||
行 253: | 行 255: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== NullIterator Class ===== | ||
+ | 이제 널 반복자(Null Iterator)가 왜 필요한지 알아봐야 할 때가 되었군요. %%MenuItem%%에 대해서 생각해 보변, | ||
+ | 반복작업을 할 대상이 없다는 것을 알 수 있습니다. 상황이 그렇다 보니 %%createIterator()%%메소드를 구현하기가 | ||
+ | 애매해집니다. 이런 경우에 두가지 방법을 떠올릴 수 있을 것입니다. | ||
+ | |||
+ | **첫 번째 방법:**\\ | ||
+ | 널을 리턴한다. | ||
+ | |||
+ | createIterator()에서 그냥 널을 리턴할 수도 있을 것입니다. 하지만 그렇게 하면 클라이언트에서 | ||
+ | 리턴된 값이 널인지 아닌지를 판단하기 위한 조건문을 써야 한다는 단점이 있죠. | ||
+ | |||
+ | **두 번째 방법: **\\ | ||
+ | %%hasNext()%%가 호출되었을 때 무조건 false를 리턴하는 반복자를 리턴한다. | ||
+ | |||
+ | 이 방법이 좀 나아 보이는군요. 이렇게 하면 여전히 반복자를 리턴할 수 있기 때문에 | ||
+ | 클라이언트에서는 리턴된 객체가 널 객체인지에 대해 신경 쓸 필요가 없습니다. " | ||
+ | 반복자를 만든다고 생각하면 됩니다. | ||
+ | |||
+ | 두 번째 방법이 확실히 좋아 보이는군요. 아무 일도 하지 않는 반복자를 %%NullIterator%%라고 부르고, | ||
+ | | ||
+ | |||
+ | <code java> | ||
+ | import java.util.Iterator; | ||
+ | |||
+ | public class NullIterator implements Iterator { | ||
+ | |||
+ | public Object next() { | ||
+ | return null; | ||
+ | } | ||
+ | |||
+ | public boolean hasNext() { | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | public void remove() { | ||
+ | throw new UnsupportedOperationException(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Waitress Class ===== | ||
+ | 여기까지 오는데 여정이 길었습니다. 이제 마지막으로 Client인 **%%Waitress%%**클래스를 구현할 차례입니다. | ||
+ | 앞서 메뉴에 있는 모든 항목에 대해서 반복작업을 수행할 수 있는 방법이 생겼으므로 그 방법을 활용해서 | ||
+ | **%%Waitress%%**에 어떤 항목이 채식주의자용 메뉴인지 알아내기 위한 메소드를 추가해보도록 하겠습니다. | ||
+ | |||
+ | <code java> | ||
+ | public class Waitress { | ||
+ | MenuComponent allMenus; | ||
+ | |||
+ | public Waitress(MenuComponent allMenus) { | ||
+ | this.allMenus = allMenus; | ||
+ | } | ||
+ | |||
+ | public void printMenu() { | ||
+ | allMenus.print(); | ||
+ | } | ||
+ | |||
+ | public void printVegetarianMenu() { | ||
+ | Iterator iterator = allMenus.createIterator(); | ||
+ | System.out.println(" | ||
+ | while (iterator.hasNext()) { | ||
+ | MenuComponent menuComponent = (MenuComponent) iterator.next(); | ||
+ | try { | ||
+ | if (menuComponent.isVegetarian()) { | ||
+ | menuComponent.print(); | ||
+ | } | ||
+ | } catch (UnsupportedOperationException e) {} | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | %%Menu%%의 %%isVegetarian()%%에서는 항상 예외를 던지도록 만들어 놨습니다. 그래서 예외가 발생하면 그 예외를 | ||
+ | 잡긴 하지만, 아무 일 없이 반복 작업을 계속 수행하도록 했습니다. |