适配器模式:揭秘措不及防需求变化的补救措施

目录

概述与模型

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();
}

}

 

posted @ 2017-03-13 09:16  码农皮邱  阅读(295)  评论(0编辑  收藏  举报