Your SlideShare is downloading. ×
HolubOnPatterns/chapter3_1
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

HolubOnPatterns/chapter3_1

1,061
views

Published on

Published in: Technology, Art & Photos

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

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

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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