适配器模式(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
阅读全文
2 0
- 适配器模式(Adapter Pattern)——随遇而安
- 设计模式——适配器模式(Adapter Pattern)
- 设计模式——适配器模式(Adapter Pattern)
- 设计模式(7)——适配器模式(Adapter Pattern)
- 设计模式 —— 适配器模式(Adapter Pattern)
- Java设计模式——适配器模式(Adapter Pattern)
- 【四】设计模式——适配器模式(Adapter Pattern)
- 设计模式——适配器模式(Adapter Pattern)
- 结构型模式——适配器模式(Adapter Pattern)
- Java设计模式——适配器模式(Adapter Pattern)
- (C++实现)——适配器模式(Adapter Pattern)
- 适配器模式(Adapter Pattern)
- 适配器模式(Adapter Pattern)
- 适配器模式(Adapter Pattern)
- 适配器模式(Adapter Pattern)
- 适配器模式(Adapter Pattern)
- 适配器模式(Adapter Pattern)
- 适配器模式(Adapter Pattern)
- Apache + Tomcat 负载均衡教程
- 深入COM框架以及实现简单的COM
- String,StringBuffer和StringBuilder的区别
- Android 零碎知识点---1
- 习题 3 -9 子序列(All in All) UVa 10304
- 适配器模式(Adapter Pattern)——随遇而安
- 把奇/偶数(或某种特征的数)都放在数组左边问题
- 数组和指针的联系
- hdu 6133 Army Formations(线段树合并)
- C语言中的字符串
- 指针数组和数组指针的区别以及main函数
- 多维数组和多维指针
- 数组参数和指针参数
- Emmet学习笔记