Holub on PatternsChapter 3.1 – Game of Life<br />아꿈사http://andstudy.com<br />안명환http://eritaka.net<br />
John Conway’s Game of Life<br />오직 2 가지 법칙<br />죽어 있는 셀은 3개의 이웃이 있으면 살아난다<br />두 개 혹은 세 개의 이웃만을 가져야만 산다<br />
특징 – Game of Life<br />Emergence<br />하위 수준에는 없는 특성이 상위 수준에서 자발적으로 출현하는 현상<br />미시 동기의 결합으로 인한 거시 행동 형성<br />다양한 패턴 발생<br />
Game of Life<br />
Static Model<br />
Design Pattern<br />Singleton<br />Visitor<br />Observer<br />Composite<br />Facade<br />Mediator<br />Prototype<br />Meme...
class Java Menu SubSyst...<br />JComponent<br />«Property><br />- <br />name<br />- <br />text<br />+ <br />setName(String...
Observer 문제<br />구현 상속 기반의 해결안<br />abstract class BadJMenuItem {<br />abstract void itemSelected();<br />}<br />classMyMe...
모든 메뉴 아이템이 BadJMenuItem상속
BadJMenuItem을 상속한 개체에만 통지</li></li></ul><li>의도<br />객체의 상태가 변경될 때 관련 객체들에게 통지하고 싶을 경우<br />class GoF_Observ...<br />Subjec...
Observer: 멀티스레드 환경 1<br />해결책 1의 문제<br />class Publisher1 {<br />ArrayList subscribers = new ArrayList();<br />// fireEven...
Observer: 멀티스레드 환경 2<br />해결책 2의 문제<br />class Publisher2 {<br />private Collection subscribers = newLinkedList();<br />//...
Observer: 멀티스레드 환경 3<br />해결책 3의 문제<br />class Publisher3 {<br />private Collection subscribers = newLinkedList();<br />pu...
Observer: 멀티스레드 환경 4<br />불변 객체 노드를 사용하는 리스트 해결법<br />이전:<br />헤드<br />d:Object<br />c:Object<br />b:Object<br />a:Object<...
class GoF_Visitor<br />Visitor<br />+ <br />VisitConcreteElementA(ConcreteElementA)<br />+ <br />VisitConcreteElementB(Con...
sd LifeGameVisitor<br />Clock<br />publisher<br />subscribers[i] :<br />:Distributor<br />subscribers[i].subscriber<br />N...
class Visitor_Car<br />«interface?<br />CarElementVisitor<br />+ <br />visit(Wheel) : void<br />+ <br />visit(Engine) : vo...
Publisher vsAWTEventMulticaster<br />AWTEventMulticaster<br />AWT의 모든 리스너 인터페이스 구현<br />이벤트 타입이 추가될 때마다 해당 인터페이스에 대한 과도한 코...
class GoF_Composite<br />Component<br />1..*<br />+ <br />Operation()<br />Client<br />+ <br />Add() : Component<br />+ <b...
class AWT_ComponentContainer<br />public void doLayout()<br />{<br />Component<br />    for( every Component in contents )...
패턴은 변형되어 실체화된다<br />Composite 패턴의 의도를 보라<br />class Directory System<br />Leaf and Component<br />SimpleFile<br />Composit...
VS<br />
Upcoming SlideShare
Loading in …5
×

HolubOnPatterns/chapter3_1

1,181
-1

Published on

Published in: Technology, Art & Photos
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,181
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
12
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

HolubOnPatterns/chapter3_1

  1. 1. Holub on PatternsChapter 3.1 – Game of Life<br />아꿈사http://andstudy.com<br />안명환http://eritaka.net<br />
  2. 2. John Conway’s Game of Life<br />오직 2 가지 법칙<br />죽어 있는 셀은 3개의 이웃이 있으면 살아난다<br />두 개 혹은 세 개의 이웃만을 가져야만 산다<br />
  3. 3. 특징 – Game of Life<br />Emergence<br />하위 수준에는 없는 특성이 상위 수준에서 자발적으로 출현하는 현상<br />미시 동기의 결합으로 인한 거시 행동 형성<br />다양한 패턴 발생<br />
  4. 4. Game of Life<br />
  5. 5. Static Model<br />
  6. 6. Design Pattern<br />Singleton<br />Visitor<br />Observer<br />Composite<br />Facade<br />Mediator<br />Prototype<br />Memento<br />Flyweight<br />
  7. 7. class Java Menu SubSyst...<br />JComponent<br />«Property><br />- <br />name<br />- <br />text<br />+ <br />setName(String) : void<br />+ <br />getName() : String<br />+ <br />setText(String) : void<br />+ <br />getText() : String<br />AbstractButton<br />JMenuBar<br />«interface><br />notifies<br />ActionListener<br />+ <br />addActionListener(ActionListener) : void<br />+ <br />add(JMenu) : void<br />«call?<br />+ <br />actionPerformed(ActionEvent) : void<br />+ <br />removeActionListener(ActionListener) : void<br /># <br />fireActionPerformed(ActionEvent) : void<br />Observer<br />1<br />Subject<br />Observer<br />JMenuItem<br />Component & Leaf<br />+ <br />JMenuItem(String)<br />Concrete Observer<br />Concrete Subject<br />*<br />Composite<br />{submenus}<br /><<anonymous>><br />1<br />Composite<br />+ <br />actionPerformed(ActionEvent) : void<br />Concrete Subject<br />JMenu<br />+ <br />add(JMenuItem) : void<br />*<br />{menus}<br />Case Study: Menu (Java Swing)<br />
  8. 8. Observer 문제<br />구현 상속 기반의 해결안<br />abstract class BadJMenuItem {<br />abstract void itemSelected();<br />}<br />classMyMenuItemextendsBadJMenuItem {<br />public void itemSelected() {<br />//아이템이 선택되었을 때 수행할 것...<br /> }<br />}<br /><ul><li>문제점
  9. 9. 모든 메뉴 아이템이 BadJMenuItem상속
  10. 10. BadJMenuItem을 상속한 개체에만 통지</li></li></ul><li>의도<br />객체의 상태가 변경될 때 관련 객체들에게 통지하고 싶을 경우<br />class GoF_Observ...<br />Subject<br />+ <br />Attach(Observer)<br />Observer<br />-observers<br />+ <br />Detach(Observer) : Observer<br />+ <br />Notify() : Observer<br />+ <br />Update()<br />1..*<br />for all o in observers {<br /> o->Update()<br />}<br />ConcreteSubject<br />ConcreteObserver<br />- <br />subjectState<br />- <br />observerState<br />-subject<br />+ <br />GetState()<br />+ <br />Update()<br />return <br />observerState = <br />subjectState<br />subject->GetState()<br />+ <br />SetState()<br />GoF – Observer Pattern<br />
  11. 11. Observer: 멀티스레드 환경 1<br />해결책 1의 문제<br />class Publisher1 {<br />ArrayList subscribers = new ArrayList();<br />// fireEvent를 기다리다가 기아 현상 발생<br />public synchronized void subscribe(Runnable subscriber) {<br />subscribers.add(subscriber);<br />}<br />public synchronized void cancelSubscribe(Runnable subscriber) {<br />subscribers.remove(subscriber);<br />}<br />private synchronized void fireEvent() {<br />for(inti=0; i < subscribers.size(); ++i)<br /> ((Runnable)subscribers.get(i)).run(); // 시간이 걸린다!<br />}}<br />
  12. 12. Observer: 멀티스레드 환경 2<br />해결책 2의 문제<br />class Publisher2 {<br />private Collection subscribers = newLinkedList();<br />// Iterator연산 중 add, remove 호출 시 예외 발생<br />public synchronized void subscribe(Runnable subscriber) {<br />subscribers.add(subscriber);<br />}<br />public synchronized void cancelSubscribe(Runnable subscriber) {<br />subscribers.remove(subscriber);<br />}<br />private void fireEvent() {<br />for( Iteratori=subscribers.iterator(); i.hasNext(); )<br /> ((Runnable)i.next()).run(); <br />}}<br />
  13. 13. Observer: 멀티스레드 환경 3<br />해결책 3의 문제<br />class Publisher3 {<br />private Collection subscribers = newLinkedList();<br />public synchronized void subscribe(Runnable subscriber) {<br />subscribers.add(subscriber);<br />}<br />public synchronized void cancelSubscribe(Runnable subscriber) {<br />subscribers.remove(subscriber);<br />}<br />// 통지 이벤트 시마다 복사본이 생성 (구독취소 이벤트와 상관없이)<br />private void fireEvent() {<br />Collection localCopy;<br />synchronized( this ) {<br />localCopy = subscribers.clone();<br />}<br />for( Iteratori=localCopy.iterator(); i.hasNext();)<br /> ((Runnable)i.next()).run();<br />}}<br />
  14. 14. Observer: 멀티스레드 환경 4<br />불변 객체 노드를 사용하는 리스트 해결법<br />이전:<br />헤드<br />d:Object<br />c:Object<br />b:Object<br />a:Object<br />이후:<br />가비지 컬렉션 될 것임<br />이전 헤드<br />d:Object<br />c:Object<br />b:Object<br />a:Object<br />헤드<br />
  15. 15. class GoF_Visitor<br />Visitor<br />+ <br />VisitConcreteElementA(ConcreteElementA)<br />+ <br />VisitConcreteElementB(ConcreteElementB)<br />ConcreteVisitor1<br />ConcreteVisitor2<br />+ <br />VisitConcreteElementA(ConcreteElementA)<br />+ <br />VisitConcreteElementA(ConcreteElementA)<br />+ <br />VisitConcreteElementB(ConcreteElementB)<br />+ <br />VisitConcreteElementB(ConcreteElementB)<br />Element<br />ObjectStructure<br />1..*<br />+ <br />Accept(Visitor)<br />ConcreteElementA<br />ConcreteElementB<br />+ <br />Accept(Visitor)<br />+ <br />Accept(Visitor)<br />v->VisitConcreteElementA(this)<br />v->VisitConcreteElementB(this)<br />GoF– Visitor Pattern<br />의도<br />기존 계층 구조를 수정하지 않고 새로운 메소드를 추가하고자 할 때<br />전문가 도입<br />
  16. 16. sd LifeGameVisitor<br />Clock<br />publisher<br />subscribers[i] :<br />:Distributor<br />subscribers[i].subscriber<br />Node<br />tick()<br />publish(:Distributor)<br />*accept(:Distributor)<br />deliverTo(subscribers[i].subscriber)<br />tick()<br />"visit" <br />메소드<br />sd GoF_Visitor<br />aObjectStructure<br />aConcreteElement[i]<br />aConcreteVisitor<br />*accept(Distributor)<br />visit(aConcreteElement[i])<br />operation()<br />Holub Visitor vsGoF Visitor 1<br />
  17. 17. class Visitor_Car<br />«interface?<br />CarElementVisitor<br />+ <br />visit(Wheel) : void<br />+ <br />visit(Engine) : void<br />+ <br />visit(Body) : void<br />«interface?<br />CarElement<br />+ <br />accept(CarElementVisitor) : void<br />CarElementPrintVisitor<br />Engine<br />Wheel<br />Body<br />class Visitor_Holub<br />+ <br />accept(CarElementVisitor) : void<br />+ <br />accept(CarElementVisitor) : void<br />+ <br />accept(CarElementVisitor) : void<br />v.visit(this)<br />v.visit(this)<br />v.visit(this)<br />Publisher<br />«interface?<br />Distributor<br />+ <br />accept(Distributor) : void<br />forall node in list<br />+ <br />deliverTo(Object) : void<br /> node.accept(:Distributor);<br /><<anonymous>><br />Node<br />+ <br />deliverTo(Object) : void<br />- <br />subscriber: Object<br />((Observer)subscriber).notify();<br />+ <br />accept(Distributor) : void<br />distributor.deliverTo(subscriber);<br />Holub Visitor vsGoF Visitor 2<br />
  18. 18. Publisher vsAWTEventMulticaster<br />AWTEventMulticaster<br />AWT의 모든 리스너 인터페이스 구현<br />이벤트 타입이 추가될 때마다 해당 인터페이스에 대한 과도한 코드 수정<br />Publisher<br />임의의 이벤트를 임의의 구독 객체에 출판<br />이벤트 타입 추가 시 코드 증가량이 작음<br />
  19. 19. class GoF_Composite<br />Component<br />1..*<br />+ <br />Operation()<br />Client<br />+ <br />Add() : Component<br />+ <br />Remove() : Component<br />+ <br />GetChild() : Component<br />Leaf<br />Composite<br />+ <br />Operation()<br />+ <br />Operation()<br />-children<br />forall g in children<br /> g.Operation();<br />+ <br />Add() : Component<br />+ <br />Remove() : Component<br />+ <br />GetChild() : Component<br />GoF – Composite Pattern<br />의도<br />개별 객체와 복합 객체를 동일하게 다루고 싶을 경우<br />
  20. 20. class AWT_ComponentContainer<br />public void doLayout()<br />{<br />Component<br /> for( every Component in contents )<br /> doLayout();<br />+ <br />doLayout() : void<br />}<br />0..*<br />1<br />Component<br />Container<br />+ <br />doLayout() : void<br />Button<br />Leaf<br />+ <br />add(Component) : Component<br />Composite<br />Checkbox<br />Leaf<br />Composite<br />Composite<br />Window<br />Composite<br />Leaf<br />Choice<br />Frame<br />Composite<br />Dialog<br />Case Study: AWT Component/Container<br />
  21. 21. 패턴은 변형되어 실체화된다<br />Composite 패턴의 의도를 보라<br />class Directory System<br />Leaf and Component<br />SimpleFile<br />Composite<br />+ <br />open()<br />+ <br />close()<br />Composite<br />+ <br />print()<br />Directory<br />public void print()<br />0..*<br />{<br />{contents}<br />+ <br />print()<br /> for(int i=0; i < contents.length; ++i)<br />+ <br />add(SimpleFile)<br /> contents[i].print();<br />1<br />+ <br />remove(SimpleFile)<br />}<br />+ <br />contents() : Iterator<br />Case Study: Directory System<br />
  22. 22. VS<br />
  23. 23. Next Stage…<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×