其他分享
首页 > 其他分享> > 设计模式学习(1)适应设计模式

设计模式学习(1)适应设计模式

作者:互联网

迭代器模式

例子

Iterator有个问题是:

下面我们用迭代器模式来实现遍历书架上的书

class Book {
    private String name;

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

    @Override
    public String toString() {
        return name;
    }
}

class BookShelf implements Aggregate {
    private Book[] books;
    private int bookNumber;

    public BookShelf(int capacity) {
        books = new Book[capacity];
        bookNumber = 0;
    }

    public Book getBook(int index) {
        return books[index];
    }

    public void addBook(Book book) {
        books[bookNumber++] = book;
    }

    public int length() {
        return bookNumber;
    }

    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

class BookShelfIterator implements Iterator {

    private BookShelf bookShelf;
    private int index;

    BookShelfIterator(BookShelf shelf) {
        bookShelf = shelf;
        index = 0;
    }

    @Override
    public boolean hasNext() {
        return index < bookShelf.length();
    }

    @Override
    public Object next() {
        return bookShelf.getBook(index++);
    }
}

// main函数
public class IteratorTest {
    public static void main(String[] args) {
        Book book1 = new Book("English");
        Book book2 = new Book("Math");
        Book book3 = new Book("Chinese");

        BookShelf bookShelf = new BookShelf(10);
        bookShelf.addBook(book1);
        bookShelf.addBook(book2);
        bookShelf.addBook(book3);

        Iterator bookIterator = bookShelf.iterator();
        while (bookIterator.hasNext()) {
            System.out.println(bookIterator.next());
        }
    }
}

角色

注意

相关设计模式

适配器模式

我们现在想要实现printWeak和printStrong两个打印方法。这两个方法已经在Banner中实现了,但是接口不同。在Banner中实现的名字叫showWithParen和showWithAster。

现在我们想通过一个适配器,把这俩接口名改过来

// 横幅类
// 提供了两种显示的方法
// 但是这两个接口与我们希望的不符合
class Banner{
    private String string; // 横幅的内容
    public Banner(String str) {
        string = str;
    }

    // 圆括号显示
    public void showWithParen(){
        System.out.println("(" + string + ")");
    }

    // 星号显示
    public void showWithAster(){
        System.out.println("*" + string + "*");
    }
}

interface Print{
    void printWeak();
    void printStrong();
}

class PrintBanner extends Banner implements Print{

    public PrintBanner(String str) {
        super(str);
    }

    @Override
    public void printWeak() {
        showWithParen();
    }

    @Override
    public void printStrong() {
        showWithAster();
    }
}

public class AdaptorTest {
    public static void main(String[] args) {
        PrintBanner printBanner = new PrintBanner("ahahaha");
        printBanner.printWeak();
        printBanner.printStrong();
    }
}

上面这种实现方式是通过继承原类,并实现接口。下面还有一种是通过委托的方法

abstract class Print{
    public abstract void printWeak();
    public abstract void printStrong();
}

class PrintBanner extends Print{
    Banner banner;
    public PrintBanner(String str) {
        banner = new Banner(str);
    }

    @Override
    public void printWeak() {
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}

角色

继承版本的

委托版本的,与继承不同的地方是

注意

相关设计模式

桥接模式:将功能与实现分离

装饰器模式:在不改变接口的情况下,增加新的功能

标签:学习,String,Iterator,void,适应,Book,bookShelf,设计模式,public
来源: https://www.cnblogs.com/destinyzk/p/16583120.html