HolubOnPatterns/chapter3_3

824 views

Published on

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

No Downloads
Views
Total views
824
On SlideShare
0
From Embeds
0
Number of Embeds
51
Actions
Shares
0
Downloads
8
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

HolubOnPatterns/chapter3_3

  1. 1. Chapter 3   라이프 게임  
  2. 2. 목차 <ul><li>Composite 패턴 다시 보기 </li></ul><ul><li>      Prototype 디자인 패턴 </li></ul><ul><li>  </li></ul><ul><li>다시 돌아온 Composite 패턴 </li></ul><ul><li>Flyweight 디자인 패턴 </li></ul><ul><li>     flyweight 풀 </li></ul><ul><li>  </li></ul><ul><li>Memento 디자인 패턴 </li></ul><ul><li>  </li></ul><ul><li>여유로운 엔딩 </li></ul>
  3. 3. Composite 패턴 다시 보기 <ul><li>208p </li></ul><ul><li>전체격자의 구성 </li></ul><ul><li>Universe - outermostCell (Neighborhood) </li></ul><ul><li>Neighborhood - cell[][] (8x8 Resident) </li></ul><ul><li>  </li></ul><ul><li>- Cell 인터페이스는 Neighborhood 와 Resident 의 구체 타입을 은닉 시켜준다 . </li></ul><ul><li>  </li></ul><ul><li>- Neighborhood 객체가 Neighborhood 와  Resident 포함에 대해 신경 쓰지 않아도 된다 . </li></ul><ul><li>  </li></ul><ul><li>- Compoiste 패턴에서 Cell 인터페이스가 Component, </li></ul><ul><li>Neighborhood 가 Composite, Resident 가 Leaf </li></ul><ul><li>  </li></ul><ul><li>  </li></ul>
  4. 4. Composite 패턴 다시 보기 <ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>Composite 패턴 구성 Component,Compsite,Leaf </li></ul>
  5. 5. Composite 패턴 다시 보기 <ul><li>  </li></ul><ul><li>- Neighborhood 가 포함하고 있는 Resident 들의 생사 여부에 상관 없이 , 안정성이라는 Cell 의 동일한 속성을 통해 효과 적으로 갱신 . ( 불안정한 Cell 들만 갱신 함으로 ) </li></ul><ul><li>  </li></ul><ul><li>- 사족을 달자면 Composite 패턴은 재귀적 처리의 깔끔한 맛 ? </li></ul>
  6. 6. Prototype 디자인 패턴 <ul><li>  outermostCell 초기화 </li></ul><ul><li>  </li></ul><ul><li>   outermostCell = new Neighborhood       ( DEFAULT_GRID_SIZE,        new Neighborhood        ( DEFAULT_GRID_SIZE,         new Resident()        )       ); </li></ul><ul><li>  </li></ul><ul><li>  이걸 만약 Command 패턴과 Abstract Factory 패턴을 함께 사용하여 작성하면 비효율 적 . p237 </li></ul><ul><li>   Abstract Factory 의 경우 보통 디폴트 상태의 객체를 생성 . </li></ul><ul><li>  - 디폴트 상태가 아닌 객체를 여럿 만들어야한다면 귀찮은 수정 작업이 .. </li></ul><ul><li>   </li></ul><ul><li>  동일한 속성의 여러 객체 클로닝해서 쓰자 . </li></ul><ul><li>  </li></ul>
  7. 7. Prototype 디자인 패턴
  8. 8. Prototype 디자인 패턴 <ul><li>  </li></ul><ul><li>  </li></ul><ul><li>Prototype: 클로닝할 수 있는 인터페이스 </li></ul><ul><li>-> public interface Cell {..... public Cell create(); ...} </li></ul><ul><li>  </li></ul><ul><li>ConcretePrototype: 복사되는 객체 </li></ul><ul><li>-> public Cell create() </li></ul><ul><li>     { return new Neighborhood(gridSize,grid[0][0]);} </li></ul><ul><li>-> public Cell create()    </li></ul><ul><li>     {return new Resident();   } </li></ul><ul><li>  </li></ul><ul><li>  </li></ul>
  9. 9. Prototype 디자인 패턴 <ul><li>Client : 클로닝 요청하는 객체 </li></ul><ul><li>   public Neighborhood(int gridSize, Cell prototype)  {   this.gridSize = gridSize;    this.grid = new Cell[gridSize][gridSize]; </li></ul><ul><li>   for( int row = 0; row < gridSize; ++row )    for( int column = 0; column < gridSize; ++column )     grid[row][column] = prototype.create();  } </li></ul>
  10. 10. 다시 돌아온 Composite 패턴 <ul><li>239p </li></ul><ul><li>Universe 의 Observer 로 등록된 객체에서 tick 마다 figureNextState->transition->refreshNow 해서 redraw </li></ul><ul><li>Resident </li></ul><ul><li>     - figureNextState 다음 상태 결정 </li></ul><ul><li>     - transition 다음 상태로 변경 </li></ul><ul><li>  </li></ul><ul><li>Neighborhood </li></ul><ul><li>     - figureNextState 다음 상태 결정 및 포함 Cell figureNextState 호출 </li></ul><ul><li>     - transition 다음에 영향갈 셀위치 저장 , 포함 Cell transition 호출 </li></ul><ul><li>  </li></ul><ul><li>Neighborhoood 가 단순히 Cell 인터페이스로 위의 행위들을 호출함으로 Neighborhood 나 Resident 와 상관없이 동일 하게 취급가능 </li></ul><ul><li>  &quot;Composite allows a group of objects to be treated in the same way as a single instance of an object.&quot; </li></ul>
  11. 11. 다시 돌아온 Composite 패턴 <ul><li>방향 저장은 243 쪽 처럼 </li></ul><ul><li>  </li></ul><ul><li>Direction 의 특징 </li></ul><ul><li>     상수를 받지 않고 객체로 받음 </li></ul><ul><li>     -> 엉뚱한 상수를 넘겨 쓰레기값 넘어오는 것 방지 . </li></ul><ul><li>     일종의 singleton </li></ul><ul><li>     - 인스턴스가 꼭 하나여야지 싱글톤은 아니다 . </li></ul>
  12. 12. Flyweight 디자인 패턴 <ul><li>만약 Jbutton 을 상속해서 셀을 만들면 메모리 낭비가 심함 . </li></ul><ul><li>  </li></ul><ul><li>메모리 공간 절약 !! </li></ul><ul><li>Flyweight 패턴으로 꼭 필요한 속성 외에는 다 외부 데이타를 가공해서 사용하는 Cell 을 구성 . </li></ul><ul><li>     (resident 는 amAlive,willbeAlive 만 Neighborhood 도 이웃정보는 레퍼런스로 ) </li></ul><ul><li>객체의 여러 속성이 꼭 객체에 포함 될 필요는 없다 . </li></ul><ul><li>     ( 크기 , 위치 등등 ) </li></ul><ul><li>    인터페이스를 잘현 하면 외부 데이타를 사용하더라도 결합도 증가 X </li></ul><ul><li>      </li></ul><ul><li>ex) userClicked(hear,surface) , redraw </li></ul><ul><li>  스스로 표현함으로 구현 쉬움 , 불필요한건 수행 안함으로 성능 향상 </li></ul>
  13. 13. Flyweight 디자인 패턴 <ul><li>메모리 사용 줄이고자 매번 외부 데이타 가공 . </li></ul><ul><li>  </li></ul><ul><li>메모리 사용량 과 구현의 단순함의 tradeoff </li></ul>
  14. 14. Flyweight 풀 <ul><li>Flyweight 풀 </li></ul><ul><li>     Clock.instance().addClockListener //{=Universe.clock.subscribe}         (    new Clock.Listener()             {    public void tick(){    if( outermostCell.figureNextState                            ( Cell.DUMMY,Cell.DUMMY,Cell.DUMMY,Cell.DUMMY,                              Cell.DUMMY,Cell.DUMMY,Cell.DUMMY,Cell.DUMMY                            ) ) {    if( outermostCell.transition() )                             refreshNow();                     } } }); </li></ul><ul><li>  Cell.DUMMY 동일한 객체 재사용 . </li></ul><ul><li>  </li></ul><ul><li>  없는 건 새로 만들어 놓고 캐싱 해놓고  가져다가 쓰기 </li></ul>
  15. 15. Memeonto 디자인 패턴 <ul><li>어떤 외부 엔티티도 객체의 구조를 알 수 없는 방식으로 객체의 상태를 캡슐화한다 . Caretaker 라 불리는 위부 객체는 객체의 무결성을 위반하지 않으면서도 객체를 저장하거나 복구할 수 있다 . </li></ul><ul><li>Originator : 자신의 스냅샷을 가진 Memento 를 생성한다 . </li></ul><ul><li>Memento : originator 의 내부상태를 노출시키지 않는 방식으로 저장 </li></ul><ul><li>Caretaker : Memento 를 저장 , but! memento 에 대해 연산 수행은 불능 </li></ul>
  16. 16. Memento 디자인 패턴
  17. 17. Memento 디자인 패턴 <ul><li>Universe (caretaker): </li></ul><ul><li>FileInputStream in = new FileInputStream(                Files.userSelected(&quot;.&quot;,&quot;.life&quot;,&quot;Life File&quot;,&quot;Load&quot;));             Clock.instance().stop();        // stop the game and             outermostCell.clear();            // clear the board.             Storable memento = outermostCell.createMemento();             memento.load( in );             outermostCell.transfer( memento, new Point(0,0), Cell.LOAD );             in.close(); </li></ul>
  18. 18. Neighborhood(originator) <ul><li>public Storable createMemento()     {    Memento m = new NeighborhoodState();         transfer(m, new Point(0,0), Cell.STORE);         return m;     }     public boolean transfer(Storable memento, Point corner,                                                         boolean load)     {     int   subcellWidth    = grid[0][0].widthInCells();         int   myWidth        = widthInCells();         Point upperLeft    = new Point( corner );         for( int row = 0; row < gridSize; ++row )         {   for( int column = 0; column < gridSize; ++column )             {    if(grid[row][column].transfer(memento,upperLeft,load))                     amActive = true;                 Direction d =                         grid[row][column].isDisruptiveTo();                 if( !d.equals( Direction.NONE ) )                     activeEdges.add(d);                 upperLeft.translate( subcellWidth, 0);             }             upperLeft.translate(-myWidth, subcellWidth );         }         return amActive;     } </li></ul>  Resident(originator)           public boolean transfer(Storable blob,Point upperLeft,boolean doLoad)     {         Memento memento = (Memento)blob;         if( doLoad )         {    if( amAlive = willBeAlive = memento.isAlive(upperLeft) )                 return true;         }         else if( amAlive )                      // store only live cells             memento.markAsAlive( upperLeft );         return false;     }
  19. 19. NeighborhoodState (concreteMemento) <ul><li>private static class NeighborhoodState implements Cell.Memento     {    Collection liveCells = new LinkedList();         public NeighborhoodState( InputStream in ) throws IOException                                                 { load(in); }         public NeighborhoodState(                ){            }         public void load( InputStream in ) throws IOException         {    try             {    ObjectInputStream source = new ObjectInputStream( in );                 liveCells = (Collection)( source.readObject() );             }             catch(ClassNotFoundException e)             {    // This exception shouldn't be rethrown as                 // a ClassNotFoundException because the                 // outside world shouldn't know (or care) that we're                 // using serialization to load the object. Nothring                 // wrong with treating it as an I/O error, however.                 throw new IOException(                             &quot;Internal Error: Class not found on load&quot;);             }         }         public void flush( OutputStream out ) throws IOException         {    ObjectOutputStream sink = new ObjectOutputStream(out);             sink.writeObject( liveCells );         }             public void markAsAlive(Point location)         {    liveCells.add( new Point( location ) );         }         public boolean isAlive(Point location)         {    return liveCells.contains(location);         }         public String toString()         {    StringBuffer b = new StringBuffer();             b.append(&quot;NeighborhoodState: &quot;);             for( Iterator i = liveCells.iterator(); i.hasNext() ;)                 b.append( ((Point) i.next()).toString() + &quot; &quot; );             return b.toString();         }     } </li></ul>
  20. 20. 요약 <ul><li>  </li></ul><ul><li>설명하기도 빡시고 이해하기도 빡시다 . </li></ul><ul><li>패턴으로 짧고 간단하게 대화하자 . </li></ul>

×