适配器模式(Adapter Pattern)——随遇而安

来源:互联网 发布:单片机堆栈指针赋值 编辑:程序博客网 时间:2024/06/13 08:59

前言

来看看某宝的爆款吧!什么十三合一的读卡器?是不是很厉害?!

这里写图片描述

读卡器作为内存卡和笔记本之间的适配器。将内存卡插入读卡器,再讲读卡器插入笔记本,这样就可以通过笔记本读取内存卡。无论你是什么型号的内存卡,通过读卡器都能通过USB接口接入电脑。可以说读卡器就是一种适配器。

概述

定义

适配器模式(Adapter Pattern)讲一个类的接口。转化成客户期望的另外另一种接口。适配器让原本接口不兼容的类可以合作无间。

说明

​ 这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。这可以让客户从实现的接口解耦。如果在一段时间之后,我们想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应付不同的接口而每次跟着修改。

类图

对象适配器类图

这里写图片描述

Target:目标抽象类

Adapter:适配器类

Adaptee:适配者类

Client:客户类

这个适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者:这种做做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配适配器使用。

类适配器类图(需要多重继承,不适合java)

这里写图片描述

设计模式的实现

背景

在jdk 1.0中有这样一段代码

package java.util;/**    …… * @see     java.util.Iterator * @see     java.io.SequenceInputStream * @see     java.util.Enumeration#nextElement() * @see     java.util.Hashtable * @see     java.util.Hashtable#elements() * @see     java.util.Hashtable#keys() * @see     java.util.Vector * @see     java.util.Vector#elements() * * @author  Lee Boynton * @since   JDK1.0 */public interface Enumeration<E> {    /**     * Tests if this enumeration contains more elements.     *     * @return  <code>true</code> if and only if this enumeration object     *           contains at least one more element to provide;     *          <code>false</code> otherwise.     */    boolean hasMoreElements();    /**     * Returns the next element of this enumeration if this enumeration     * object has at least one more element to provide.     *     * @return     the next element of this enumeration.     * @exception  NoSuchElementException  if no more elements exist.     */    E nextElement();}

在JDK 1.2 中还有这样一段代码:

package java.util;import java.util.function.Consumer;/**    …… * @param <E> the type of elements returned by this iterator * * @author  Josh Bloch * @see Collection * @see ListIterator * @see Iterable * @since 1.2 */public interface Iterator<E> {    /**     * Returns {@code true} if the iteration has more elements.     * (In other words, returns {@code true} if {@link #next} would     * return an element rather than throwing an exception.)     *     * @return {@code true} if the iteration has more elements     */    boolean hasNext();    /**     * Returns the next element in the iteration.     *     * @return the next element in the iteration     * @throws NoSuchElementException if the iteration has no more elements     */    E next();    /**     * Removes from the underlying collection the last element returned     * by this iterator (optional operation).  This method can be called     * only once per call to {@link #next}.  The behavior of an iterator     * is unspecified if the underlying collection is modified while the     * iteration is in progress in any way other than by calling this     * method.     *     * @implSpec     * The default implementation throws an instance of     * {@link UnsupportedOperationException} and performs no other action.     *     * @throws UnsupportedOperationException if the {@code remove}     *         operation is not supported by this iterator     *     * @throws IllegalStateException if the {@code next} method has not     *         yet been called, or the {@code remove} method has already     *         been called after the last call to the {@code next}     *         method     */    default void remove() {        throw new UnsupportedOperationException("remove");    }    /**     * Performs the given action for each remaining element until all elements     * have been processed or the action throws an exception.  Actions are     * performed in the order of iteration, if that order is specified.     * Exceptions thrown by the action are relayed to the caller.     *     * @implSpec     * <p>The default implementation behaves as if:     * <pre>{@code     *     while (hasNext())     *         action.accept(next());     * }</pre>     *     * @param action The action to be performed for each element     * @throws NullPointerException if the specified action is null     * @since 1.8     */    default void forEachRemaining(Consumer<? super E> action) {        Objects.requireNonNull(action);        while (hasNext())            action.accept(next());    }}

而今天我们经常面对遗留代码,这些代码暴露出枚举器接口,旦我们又希望在新的代码中只使用迭代器。这时候,我们就需要构造一个迭代器。

类图

这里写图片描述

代码实现

package adapter;import java.util.Enumeration;import java.util.Iterator;/** * Created by ChongLou on 2017/8/19. */public class EnumerationIterator implements Iterator {    Enumeration enum1;    public EnumerationIterator(Enumeration enum1) {        this.enum1 = enum1;    }    public boolean hasNext() {        return enum1.hasMoreElements();    }    public Object next() {        return enum1.nextElement();    }    public void remove() {        throw new UnsupportedOperationException();    }}

总结

​ 适配器模式在生活中很常见,当我们没办法直接将内存卡插上电脑的时候,记得使用读卡器(适配器模式)哦。QAQ

原创粉丝点击