适配器模式


当我们需要将一个类的接口转换成用户需要的另外一个接口的时候,就可以使用 适配器模式了,它可以让两个没有关联的类一起工作。适配器分为两种: 对象适配器类适配器

对象适配器

我们引用上一章的 Processor 接口,在这里作为目标接口:

public interface Processor {

    public Object process(Object input);
}

再创建一个需要被适配的 Filter 类和适配器类 Adapter:

public class Filter {

    /**
     * 具有特殊功能的 process 方法
     * @param input
     * @return
     */
    public String process(Object input) {
        return ((String)input).replace(" ", "-");
    }
}

class Adapter implements Processor {

    //被适配的类对象
    private Filter filter;

    /**
     *  有参构造,传入需要适配的类对象
     * @param filter
     */
    public Adapter(Filter filter) {
        this.filter = filter;
    }

    @Override
    public String process(Object input) {
        return filter.process(input);
    }

    public static void main(String[] args) {
        String str = "this is a string!";
        //创建适配器对象
        Adapter adapter = new Adapter(new Filter());
        System.out.println(adapter.process(str));
    }
}

打印结果如下:

this-is-a-string!

我们可以看到被适配的类 Filter 和 Processor 接口是毫不相关的,但是我们通过适配器类 Adpter 来接受传入的 Filter 对象,来生成一个 Processor 对象(Adapter 实现了 Processor 接口,Adapter 对象即 Processor 对象),这样我们就可以通过 Processor 对象来调用不同的被适配类的功能了。本例中,被适配的类 Filter 也可以是接口 (interface)。

类适配器

如果我们需要即包含 Filter 的特性又包含 Processor 的特性的类,那么就可以使用类适配器,通过继承 Filter 类和实现 Processor 接口来创建(因为 Java 不支持多继承),生成即是 Filter 又是 Processor 的新类,代码如下:

class Adapter extends Filter implements Processor {

@Override
public String process(Object input) {
    //调用父类 Filter 中的 process 方法
    return super.process(input);
}

public static void main(String[] args) {
    String str = "this is a string!";
    //创建适配器对象
    Adapter adapter = new Adapter();
    System.out.println(adapter.process(str));
}

}

打印结果一样:

this-is-a-string!

小结

大家可能注意到了,在对象适配器中用到了代理,将接口从具体实现中解耦使得接口可以拥有多个被适配类的功能,对象适配器相较于类适配器更加灵活。

欢迎关注公众号:一盐难进

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值