Iterator と Adaptor デザインパターン 第1回 [email protected] 1. Iterator パターン while ( it.hasNext() ) { ... = it.next(); ... } 配列や Vector などの実装方法に関わらずに,上 のようなことをできるようにしたい。 デザインパターン第1回 2 例題のクラス図 <<interface>> Aggregate Creates <<interface>> Iterator hasNext next iterator BookShelf books last getBookAt appendBook getLength iterator BookShelfIterator Book name getName デザインパターン第1回 bookShelf index hasNext next 3 book.java public class Book { private String name = ""; public Book(String name) { this.name = name; } public String getName() { return name; } } デザインパターン第1回 4 BookShelf.java (1) public class BookShelf implements Aggregate{ private Book[] books; private int last = 0; public BookShelf(int maxsize) { this.books = new Book[maxsize]; } public Book getBookAt(int index) { return books[index]; } デザインパターン第1回 5 BookShelf.java (2) public void appendBook(Book book) { this.books[last] = book; last++; } public int getLength() { return last; } public Iterator iterator() { return new BookShelfIterator(this); } } デザインパターン第1回 6 BookShelfIterator.java (1) public class BookShelfIterator implements Iterator { private BookShelf bookShelf; private int index; public BookShelfIterator(BookShelf bookShelf) { this.bookShelf = bookShelf; this.index = 0; } デザインパターン第1回 7 BookShelfIterator.java (2) public boolean hasNext() { if (index < bookShelf.getLength()) { return true; } else { return false; } } デザインパターン第1回 8 BookShelfIterator.java (3) public Object next() { Book book = bookShelf.getBookAt(index); index++; return book; } } デザインパターン第1回 9 Aggregate.java public interface Aggregate { public abstract Iterator iterator(); } デザインパターン第1回 10 Iterator.java public interface Iterator { public abstract boolean hasNext(); public abstract Object next(); } デザインパターン第1回 11 Main.java (1) public class Main { public static void main(String[] args) { BookShelf bookShelf = new BookShelf(4); bookShelf.appendBook( new Book("Around the World in 80 Days")); bookShelf.appendBook(new Book("Bible")); bookShelf.appendBook(new Book("Cinderella")); bookShelf.appendBook( new Book("Daddy-Long-Legs")); デザインパターン第1回 12 Main.java (2) Iterator it = bookShelf.iterator(); while (it.hasNext()) { Book book = (Book)it.next(); System.out.println("" + book.getName()); } } } デザインパターン第1回 13 実行結果 Around the World in 80 Days Bible Cinderella Daddy-Long-Legs デザインパターン第1回 14 パターン <<interface>> Aggregate Creates <<interface>> Iterator hasNext next iterator ConcreteAggregate ConcreteIterator aggregate iterator hasNext next デザインパターン第1回 15 2. Adaptor パターン(継承を使 う) • インタフェースの合わないものを合わせる。 デザインパターン第1回 16 例題のクラス図 Main uses <<interface>> Print printWeak printStrong PrintBanner printWeak printStrong デザインパターン第1回 Banner showWithParen showWithAster 17 Banner.java (1) public class Banner { private String string; public Banner(String string) { this.string = string; } public void showWithParen() { System.out.println("(" + string + ")"); } デザインパターン第1回 18 Banner.java (2) public void showWithAster() { System.out.println("*" + string + "*"); } } デザインパターン第1回 19 PrintBanner.java public class PrintBanner extends Banner implements Print { private Banner banner; public PrintBanner(String string) { this.banner = new Banner(string); } public void printWeak() { banner.showWithParen(); } public void printStrong() { banner.showWithAster(); } } デザインパターン第1回 20 Print.java public interface Print { public abstract void printWeak(); public abstract void printStrong(); } デザインパターン第1回 21 Main.java public class Main { public static void main(String[] args) { Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong(); } } デザインパターン第1回 22 実行結果 (Hello) *Hello* デザインパターン第1回 23 パターン Client uses <<interface>> Target targetMethod1 targetMethod2 implements Adapter Adaptee extends targetMethod1 targetMethod2 デザインパターン第1回 methodA methodB methodC 24 3. Adaptor パターン(委譲を使 う) • インタフェースの合わないものを合わせる。 デザインパターン第1回 25 例題のクラス図 Main uses Print PrintBanner Banner banner printWeak printStrong printWeak printStrong デザインパターン第1回 showWithParen showWithAster 26 PrintBanner.java (1) public class PrintBanner extends Print { private Banner banner; public PrintBanner(String string) { this.banner = new Banner(string); } public void printWeak() { banner.showWithParen(); } デザインパターン第1回 27 PrintBanner.java (2) public void printStrong() { banner.showWithAster(); } } デザインパターン第1回 28 Print.java public abstract class Print { public abstract void printWeak(); public abstract void printStrong(); } デザインパターン第1回 29 Main.java public class Main { public static void main(String[] args) { Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong(); } } デザインパターン第1回 30 パターン Client uses Target extends Adapter adaptee targetMethod1 targetMethod2 targetMethod1 targetMethod2 デザインパターン第1回 Adaptee has methodA methodB methodC 31
© Copyright 2024 ExpyDoc