适配器模式:揭秘措不及防需求变化的补救措施
目录
概述与模型
1、概述
含义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
说明:这是一种补救措施,在最开始设计的时候不建议使用这种设计模式。
分类:类适配器、对象适配器。类适配器就是采用继承的方式,对象适配器采用组合的方式,源于Java里面只支持单继承,所以此处只实现对象适配器。
2、模型
应用场景描述
场景描述:假设我需要在我的笔记本电脑上接入键盘,我这个键盘比较奇葩,不是USB接口的,是圆孔的。而且,我们这里还没有USB的卖,而且现在10000个程序员需要键盘,这种突发状况也很少见啊,很可能成为常态,我们又不可能去改变原来的设计结构,我们该怎么办?用户需求(使用键盘,我才不管怎么解决呢?)-->调用Adapter(转换器)-->Adaptee(圆孔线键盘)。而正常情况下是,用户需求(使用键盘)-->Adaptee(USB接口键盘)。我们来看实现。
适配器模式实现
1、目标对象
public interface Target { public void request(); }
2、适配器
public class Adapter implements Target { private Adaptee adaptee;</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Adapter(Adaptee adaptee) { </span><span style="color: #0000ff;">this</span>.adaptee =<span style="color: #000000;"> adaptee; } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> request() { System.out.println(</span>"添加一个适配器给adaptee"<span style="color: #000000;">); adaptee.specialRequest(); }
}
3、被适配者
public class Adaptee { public void specialRequest(){ System.out.println("接入键盘!"); } }
4、客户端测试
public class Client { public static void main(String [] args){ //流程:程序员-->使用(request)-->适配器(Adapter)-->键盘(Adaptee) Target coder=new Adapter(new Adaptee()); //我要使用键盘 coder.request(); } }
5、测试结果
再进一步
1、适配器模式是什么?适配器模式有什么用?
将一个类的接口,转换成客户需要的接口。也就是说,用户只关心接口(Target),并不关心你内部的实现,而当有特殊需求的时候,我们只需要不断的新增适配器就行,并不用关心其他的。
这是一种补救措施,最初设计不够完善的解决方案。
2、真实世界的适配器
IO中:InputStream-->FileInputstream-->File:最初IO肯定就是只是处理流,而不处理其他的。而随着变化,现在需求是,我要读取二进制流(二进制文件)。那么InputStream无法改变,用户需求无法改变,我们只能添加适配器来解决,从而就演变出FileInputStream、DataInputStream来充当适配器角色,可能以后还会出现各种处理流对象的适配器待你去解决呢。关于IO的整体处理细节参考我的装饰者模式:http://www.cnblogs.com/qiuyong/p/6538856.html
InputStream-Target is=new FileInputStream-Adapter (new File()-Adaptee);
is.read();
通过上述描述你可能已经知道适配器模式的作用了,不妨自己也造一个关于适配器模式的运用场景?
比如,迭代器(Target)-->枚举类适配器-->处理hasNext()、...
public class EnumrationIterator implements Iterator{Enumeration enumeration; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> EnumrationIterator(Enumeration enumeration) { </span><span style="color: #0000ff;">this</span>.enumeration=<span style="color: #000000;">enumeration; } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span><span style="color: #000000;"> hasNext() { </span><span style="color: #0000ff;">return</span> (<span style="color: #0000ff;">boolean</span><span style="color: #000000;">)enumeration.hasMoreElements(); } </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Object next() { </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> enumeration.nextElement(); } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> remove() { </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> UnsupportedOperationException(); }
}