11. Observer: 멀티스레드 환경 1 해결책 1의 문제 class Publisher1 { ArrayList subscribers = new ArrayList(); // fireEvent를 기다리다가 기아 현상 발생 public synchronized void subscribe(Runnable subscriber) { subscribers.add(subscriber); } public synchronized void cancelSubscribe(Runnable subscriber) { subscribers.remove(subscriber); } private synchronized void fireEvent() { for(inti=0; i < subscribers.size(); ++i) ((Runnable)subscribers.get(i)).run(); // 시간이 걸린다! }}
12. Observer: 멀티스레드 환경 2 해결책 2의 문제 class Publisher2 { private Collection subscribers = newLinkedList(); // Iterator연산 중 add, remove 호출 시 예외 발생 public synchronized void subscribe(Runnable subscriber) { subscribers.add(subscriber); } public synchronized void cancelSubscribe(Runnable subscriber) { subscribers.remove(subscriber); } private void fireEvent() { for( Iteratori=subscribers.iterator(); i.hasNext(); ) ((Runnable)i.next()).run(); }}
13. Observer: 멀티스레드 환경 3 해결책 3의 문제 class Publisher3 { private Collection subscribers = newLinkedList(); public synchronized void subscribe(Runnable subscriber) { subscribers.add(subscriber); } public synchronized void cancelSubscribe(Runnable subscriber) { subscribers.remove(subscriber); } // 통지 이벤트 시마다 복사본이 생성 (구독취소 이벤트와 상관없이) private void fireEvent() { Collection localCopy; synchronized( this ) { localCopy = subscribers.clone(); } for( Iteratori=localCopy.iterator(); i.hasNext();) ((Runnable)i.next()).run(); }}
14. Observer: 멀티스레드 환경 4 불변 객체 노드를 사용하는 리스트 해결법 이전: 헤드 d:Object c:Object b:Object a:Object 이후: 가비지 컬렉션 될 것임 이전 헤드 d:Object c:Object b:Object a:Object 헤드
15. class GoF_Visitor Visitor + VisitConcreteElementA(ConcreteElementA) + VisitConcreteElementB(ConcreteElementB) ConcreteVisitor1 ConcreteVisitor2 + VisitConcreteElementA(ConcreteElementA) + VisitConcreteElementA(ConcreteElementA) + VisitConcreteElementB(ConcreteElementB) + VisitConcreteElementB(ConcreteElementB) Element ObjectStructure 1..* + Accept(Visitor) ConcreteElementA ConcreteElementB + Accept(Visitor) + Accept(Visitor) v->VisitConcreteElementA(this) v->VisitConcreteElementB(this) GoF– Visitor Pattern 의도 기존 계층 구조를 수정하지 않고 새로운 메소드를 추가하고자 할 때 전문가 도입