public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class BookShelf implements Iterable<Book> {
private List<Book> books;
public BookShelf(int initialsize) {
this.books = new ArrayList<>(initialsize);
}
public Book getBookAt(int index) {
return books.get(index);
}
public void appendBook(Book book) {
books.add(book);
}
public int getLength() {
return books.size();
}
@Override
public Iterator<Book> iterator() {
return new BookShelfIterator(this);
}
}
public class BookShelfIterator implements Iterator<Book> {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
@Override
public Book next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
Adapter Pattern
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(String string) {
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
Template Method
public interface AbstractDisplay {
public void open();
public void print();
public void close();
public default void display() {
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}
public class CharDisplay implements AbstractDisplay {
private char ch; // 표시해야 하는 문자
// 생성자
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
// 시작 문자열 "<<"를 표시한다
System.out.print("<<");
}
@Override
public void print() {
// 필드에 저장해 둔 문자를 1회 표시한다
System.out.print(ch);
}
@Override
public void close() {
// 종료 문자열 ">>"를 표시한다
System.out.println(">>");
}
}
public class StringDisplay implements AbstractDisplay {
private String string; // 표시해야 하는 문자열
private int width; // 문자열의 길이
// 생성자
public StringDisplay(String string) {
this.string = string;
this.width = string.length();
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + string + "|");
}
@Override
public void close() {
printLine();
}
// open과 close에서 호출되어 "+----+" 문자열을 표시하는 메소드
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
Iterator Pattern
Adapter Pattern
Template Method