适配器模式

适配器模式介绍
适配器模式在开发中使用率很高,从代码中就可见的Adapter就可以看出。从早期经常使用的ListView,GridView到现在最新的RecyclerView都使用的Adapter,在开发中我们遇到的优化问题,出错概率较大的地方也基本出自Adapter。适配器是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得它们能够协作起来。

适配器模式的定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

适配器模式使用场景

  1. 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
  2. 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类
  3. 需要一个统一的输出接口,而输入端的类型不可预知。
    适配器模式的UML类图
    这里写图片描述

一。类的适配器模式

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类,
//是需要兼容被适配的类
class Adaptee {  
    public void specificRequest() {  
        System.out.println("被适配器,需要兼容的特殊功能...");  
    }  
}  

// 目标接口,或称为标准接口
interface Target {  
    public void request();  
}  

// 具体目标类,只提供普通功能  
class ConcreteTarget implements Target {  
    public void request() {  
        System.out.println("普通类 具有 普通功能...");  
    }  
}  

// 适配器类,继承了被适配类,同时实现标准接口,
class Adapter extends Adaptee implements Target{  
    public void request() {  
        super.specificRequest();  
    }  
}  

// 测试类
public class Client {  
    public static void main(String[] args) {  
        // 使用不需要适配的普通功能类  
        Target concreteTarget = new ConcreteTarget();  
        concreteTarget.request();  

        // 使用特殊功能类,即需要适配的适配类  
        Target adapter = new Adapter();  
        adapter.request();  
    }  
}  

测试结构:

普通类 具有普通功能
被适配器,需要兼容的特殊功能…

上面这种实现的适配器模式称为类适配器,因为Adapter类既继承了Adaptee,也实现了Target接口。在Client类中我们可以根据需要选择并创建任一种符合要求的子类,来实现具体功能。

另一种适配器模式是对象适配器,它不是多继承或继承在实现的方式,而是使用直接关联,或者称为委托的方式,类图如下:
这里写图片描述

//适配类,直接关联被适配类,同时实现标准接口
class Adapter implements Target{
    //直接关联被适配的类
    private Adapter adapter;
    //可以通过构造函数传入具体需要适配的被适配类对象
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    public void request(){
        this.adapter.specificRequest();//委托的方式完成特殊功能
    }
}

// 测试类  
public class Client {  
    public static void main(String[] args) {  
        // 使用普通功能类  
        Target concreteTarget = new ConcreteTarget();  
        concreteTarget.request();  

        // 使用特殊功能类,即适配类,  
        // 需要先创建一个被适配类的对象作为参数  
        Target adapter = new Adapter(new Adaptee());  
        adapter.request();  
    }  
}  

测试结构和上面一致。从类图中我们知道和类适配模式比,我们只需要修改Adapter类的内部结构,即Adapter自身必须先拥有一个被适配类的对象,再把具体的特殊功能委托给这个对象来实现。

适配器模式总结
优点:
1.更好的复用性系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用
2.更好的扩展性,在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

缺点:
1.过多的使用适配器,会让系统非常凌乱不易整体把握。例如,明明看到调用A接口,其实内部被适配了B接口的实现,一个系统如果太多出现这中情况,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以不使用适配器,而是直接对系统进行重构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值