图解设计模式 --适应设计模式

本文详细介绍了设计模式中的Iterator模式和Adapter模式。Iterator模式用于在数据集合中顺序遍历,分离了遍历操作与数据结构的实现。Adapter模式则用于填补现有程序与所需程序之间的差异,分为类适配器和对象适配器两种形式,通过适配器角色将不兼容的接口转换为可使用的接口。
摘要由CSDN通过智能技术生成

代码Github连接 :https://github.com/tangbi123/Tab-Design-Pattern

一、iterator模式

Iterator模式用于在数据集合中按照顺序遍历集合。
将遍历和实现分离。

1、示例

 图1.1 Iterator示例

名字说明
Aggregate表示集合的接口
Iterator遍历集合的接口
Book表示书的类
BookShelf表示书架的类
BookShelfIterator遍历书架的类
Main测试程序行为的类

代码清单

  1. Iterator
public interface MyIterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

2)Aggregate

public interface Aggregate {
    public abstract MyIterator myIterator();
}
  1. Book : class
public class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
  1. 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模式无法使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值