이터레이터패턴 2부 패턴적용하기

2022-07-07-이터레이터패턴-2부-패턴적용하기

목차

01.코드 개선하기

01.1 RecentPostIterator

01.2 Client

01.3 Board

01.코드 개선하기

01.1 RecentPostIterator

package me.whiteship.designpatterns._03_behavioral_patterns._16_iterator._02_after;

import me.whiteship.designpatterns._03_behavioral_patterns._16_iterator._01_before.Post;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class RecentPostIterator implements Iterator<Post> {

    private Iterator<Post> internalIterator;

    public RecentPostIterator(List<Post> posts) {
        Collections.sort(posts, (p1, p2) -> p2.getCreatedDateTime().compareTo(p1.getCreatedDateTime()));
        this.internalIterator = posts.iterator();
    }

    @Override
    public boolean hasNext() {
        return this.internalIterator.hasNext();
    }

    @Override
    public Post next() {
        return this.internalIterator.next();
    }
}
  • concreate aggregate를 알고 있는 경우

01.2 Client

  • before

    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    
    public class Client {
    
      public static void main(String[] args) {
          Board board = new Board();
          board.addPost("디자인 패턴 게임");
          board.addPost("선생님, 저랑 디자인 패턴 하나 학습하시겠습니까?");
          board.addPost("지금 이 자리에 계신 여러분들은 모두 디자인 패턴을 학습하고 계신 분들입니다.");
    
          // TODO 들어간 순서대로 순회하기
          List<Post> posts = board.getPosts();
          for (int i = 0 ; i < posts.size() ; i++) {
              Post post = posts.get(i);
              System.out.println(post.getTitle());
          }
    
          // TODO 가장 최신 글 먼저 순회하기
          Collections.sort(posts, (p1, p2) -> p2.getCreatedDateTime().compareTo(p1.getCreatedDateTime()));
          for (int i = 0 ; i < posts.size() ; i++) {
              Post post = posts.get(i);
              System.out.println(post.getTitle());
          }
      }
    
    }
  • after

    import java.util.Iterator;
    import java.util.List;
    
    public class Client {
    
      public static void main(String[] args) {
          Board board = new Board();
          board.addPost("디자인 패턴 게임");
          board.addPost("선생님, 저랑 디자인 패턴 하나 학습하시겠습니까?");
          board.addPost("지금 이 자리에 계신 여러분들은 모두 디자인 패턴을 학습하고 계신 분들입니다.");
    
          // TODO 들어간 순서대로 순회하기
          List<Post> posts = board.getPosts();
          Iterator<Post> iterator = posts.iterator();
          System.out.println(iterator.getClass());
    
          for (int i = 0 ; i < posts.size() ; i++) {
              Post post = posts.get(i);
              System.out.println(post.getTitle());
          }
    
          // TODO 가장 최신 글 먼저 순회하기
          Iterator<Post> recentPostIterator = board.getRecentPostIterator();
          while(recentPostIterator.hasNext()) {
              System.out.println(recentPostIterator.next().getTitle());
          }
      }
    }

01.3 Board

  • before

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    
    public class Board {
    
      List<Post> posts = new ArrayList<>();
    
      public List<Post> getPosts() {
          return posts;
      }
    
      public void setPosts(List<Post> posts) {
          this.posts = posts;
      }
    
      public void addPost(String content) {
          this.posts.add(new Post(content));
      }
    }
  • after

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Board {
    
      List<Post> posts = new ArrayList<>();
    
      public List<Post> getPosts() {
          return posts;
      }
    
      public void addPost(String content) {
          this.posts.add(new Post(content));
      }
    
      public Iterator<Post> getRecentPostIterator() {
          return new RecentPostIterator(this.posts);
      }
    }

Written by@[KyeongMinPark]
Docker, C++, C#, Java, Golang으로 개발 모니터링운영 및 개발, 자원수집기 Beat & Exporter 개발 Gitlab Runner CI/CD & Hugo 연동과 테스트코드및 등을 공부와 개발중 ORM, TDD, BDD, DDD, DesignPattern, WebAssembly Studying

GitHub