ソフトウェアパターン - 法政大学 [HOSEI UNIVERSITY]

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