代码Github连接 :https://github.com/tangbi123/Tab-Design-Pattern
一、iterator模式
Iterator模式用于在数据集合中按照顺序遍历集合。
将遍历和实现分离。
1、示例
名字 | 说明 |
---|---|
Aggregate | 表示集合的接口 |
Iterator | 遍历集合的接口 |
Book | 表示书的类 |
BookShelf | 表示书架的类 |
BookShelfIterator | 遍历书架的类 |
Main | 测试程序行为的类 |
代码清单
- Iterator
public interface MyIterator {
public abstract boolean hasNext();
public abstract Object next();
}
2)Aggregate
public interface Aggregate {
public abstract MyIterator myIterator();
}
- Book : class
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
- BookShelf
public class BookShelf implements Aggregate{
private ArrayList<Book> books;
public BookShelf() {
this.books = new ArrayList<>();
}
public Book getBookAt(int index){
return books.get(index);
}
public void appendBook(Book book){
this.books.add(book);
}
public int getLength(){
return books.size();
}
@Override
public MyIterator myIterator() {
return new BookShelfIterator(this);
}
}
5)BookShelfIterator
public class BookShelfIterator implements MyIterator{
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;
}
return false;
}
@Override
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
6)main
public class main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf();
bookShelf.appendBook(new Book("test1"));
bookShelf.appendBook(new Book("test2"));
bookShelf.appendBook(new Book("test3"));
bookShelf.appendBook(new Book("test4"));
MyIterator myIterator = bookShelf.myIterator();
while(myIterator.hasNext()){
Book book = (Book)myIterator.next();
System.out.println(book.getName());
}
}
}
2、角色
1)Iterator
按顺序逐个遍历元素的接口(API)
2)ConcreteIterator
实现Iterator角色所定义的接口(API)
3)Aggregate
定义创建Iterator角色的接口(API)
4)ConcreteAggregate
实现Aggregate角色所定义的接口(API)
3、思路点
1)iterator可以将遍历与实现分离开开
2)next
返回当前元素,指向下一个元素
二、Adaper模式
Adapter模式:用于填补“现有程序”和“所需的程序”之间差异的设计模式。
分两种:
1、类适配器模式(继承)
2、对象适配器模式(委托)
1、示例
(1)继承-代码清单
1)Banner类
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 + "*");
}
}
2)Print接口(需求)
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
3)PrintBanner类
public class PrintBanner extends Banner implements Print{
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
4)main
public class main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printStrong();
p.printWeak();
}
}
(2)委托-代码清单
1)Banner类
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 + "*");
}
}
2)Print类, 注意区别 抽象类
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
3)PrintBanner类
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();
}
}
4)main
public class main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printStrong();
p.printWeak();
}
}
2、角色
1)Target(对象)
定义所需要的方法。 =》 Print接口
2)Client(请求者)
负责使用Target角色所定义的方法进行具体处理。 =》 main
3)Adaptee(被适配)
持有既定方法的角色。 =》 Banner
4)Adapter(适配)
使用Adaptee方法,来满足Target角色需求。 =》PrintBanner
3、思路要点
1)什么时候使用Adapter
对于现有的组件重复利用。
Adapter模式对现有的类进行适配,生成新的类。
排查Bug在Adapter角色。
2)只需要现有类的功能,就可以编写出新的类。
3)版本升级和兼容
使用Adapter模式,使得新旧版本兼容。
4)功能完全不同的类,Adapter模式无法使用。