设计模式学习系列之适配器模式

什么是适配器模式?

    适配器模式(Adapter Pattern)又叫变压器模式。适配器模式是将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作。

适配器模式的关键是什么?

    适配器继承或依赖已有的对象,实现想要的目标接口。适配器模式包括两种形式,包括:类的适配器模式和对象的适配器模式,其中下图中左图是类的适配器模式,右图是对象的适配器模式。

类的适配器模式

    类的适配器模式是把被适配的类的api转化为目标类的api,静态结构如图:


    图中adaptee类并不包含sampleOperation2类,但是客户端期待可以适配,因此我们提供一个中间环节。把Adaptee的api和Target的api衔接起来,其中Adapter和Adaptee是继承关系。其中涉及三个角色:

    1)目标(target)角色:这就是所期待得到的接口。由于这里讨论的是类适配器模式,因此目标不可能是类。

    2)源(Adaptee)角色:现有需要适配的接口

    3)适配器(Adapter)角色:适配器类是本模式的核心。适配器把源接口转化为目标接口。

    类的适配器模式的效果是使用一个具体类把源适配到目标中。

    目标角色代码示例:

public interface Target {

    public void sampleOperation1();

    public void sampleOperation2();

}

    源角色代码示例:    

public class Adaptee {

    public void sampleOperation1() {
        System.out.println("this is sampleOperation1");
    }

}
    适配器角色代码示例:

public class Adapter extends Adaptee implements Target {

    @Override
    public void sampleOperation2() {
        System.out.println("this is sampleOperation2");
    }
}

对象的适配器模式

    与类的适配器模式不同的是adapter不是使用继承关系连接到adaptee类,而是通过委派关系,其结构图如下:


    图中可以看出Adaptee类中并没有sampleOperation2方法,这个与类的适配器模式相同,不同的是对象的适配器模式采用一种包装(wrapper)类adapter,这个类包装了一个adaptee实例,从而此包装类能够把Adaptee的api和Adapter的api衔接起来。

    对象的适配器模式与类的适配器模式不同,其代码示例为:

public class Adapter implements Target {

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        super();
        this.adaptee = adaptee;
    }


    @Override
    public void sampleOperation1() {
        adaptee.sampleOperation1();
    }

    @Override
    public void sampleOperation2() {
        System.out.println("this is sampleOperation2");
    }
}

适配器模式的优点

    1)适配器模式让两个没有关系的类在一起运动

    2)增加了类的透明性

    3)提高了类的复用性

    4)灵活性非常好

使用适配器模式的场景

    1)系统需要使用现有的类,而此类的接口不符合系统的需求。

    2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大联系的类,包括一些可能在将来引进的类协同工作。

参考

​《设计模式之禅》
《java与模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值