其他分享
首页 > 其他分享> > 设计模式之适配器模式

设计模式之适配器模式

作者:互联网

什么是适配器模式?

适配器模式将一个类的接口,转换为客户期望的另一个接口。适配器让原本不兼容的类可以合作无间

成员角色

客户(Client):只能调用目标接口功能,不能直接使用被适配器,但可以通过适配器的接口转换间接使用被适配器。

目标接口(Target):客户看到的接口,适配器必须实现该接口才能被客户使用。

适配器(Adapter):适配器把被适配者接口转换为目标接口,提供给客户使用。

被适配者(Adaptee):被适配者接口与目标接口不兼容,需要适配器转换成目标接口子类,才能被客户使用。

比如:用鸟叫和鸟飞的例子解析适配器模式,鹦鹉会叫也会飞,但鹅就只会叫不会飞,而且鹅也不是鸟类,创建一个适配器,把鹅转换成鸟。

第一步、创建鸟接口,对应角色目标接口

//鸟接口
public interface Bird {
    //鸟叫
    public void chirp();
    //飞
    public void fly();
}

第二步、创建鹦鹉类

//鹦鹉类实现鸟接口
public class Parrot implements Bird{
 
    public void chirp() {
        System.out.println("呜呜呜");     
    }
 
    public void fly() {
        System.out.println("我能飞很远很远");     
    }
 
}

第三步、创建鹅类,对应角色被适配者

//鹅类,不是鸟
public class Goose {
    //鹅会叫但不会飞,没有飞的方法
    public void chirp(){
        System.out.println("嘎嘎嘎");
    }
}

第四步、创建适配器

//适配器,把鹅类适配为鸟
public class GooseAdapter implements Bird{
    //组合鹅类
    Goose goose;
    public GooseAdapter(Goose goose){
        this.goose = goose;
    }
     
    public void chirp() {
        if(goose != null){
            //调用鸟叫的时候委托鹅叫
            goose.chirp();
        }
    }
 
    public void fly() {
        //不支持该操作,可以抛出该异常,客户可以知道详情
        throw new UnsupportedOperationException();
    }
 
}

优点:

(1)、转换接口,适配器让不兼容的接口变成兼容。

(2)、让客户和实现的接口解耦。有了适配器,客户端每次调用不兼容的接口时,不用修改自己的代码,只要调用适合的适配器就可以了。

(3)、使用了对象组合设计原则。以组合的方式包装被适配者,被适配者的任何子类都可以搭配着同一个适配器使用。

(4)、体现了“开闭”原则。适配器模式把客户和接口绑定起来,而不是和具体实现绑定,我们可以使用多个配适器来转换多个后台类,也可以很容易地增加新的适配器。

缺点:

(1)、每个被适配者都需要一个适配器,当适配器过多时会增加系统复杂度,降低运行时的性能。

(2)、实现一个适配器可能需要下一番功夫,增加开发的难度。

适用场景:

当要使用的两个类所做的事情相同或者相似,但是具有不同的接口时考虑使用配适器模式。

当需要统一客户端调用接口的代码,而所调用的接口具有不兼容问题时使用适配器模式。这样客户端只有调用一个接口就行了,这样可以更简单、更直接、更紧凑。

在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。

标签:适配,适配器,接口,goose,void,模式,设计模式,public
来源: https://blog.csdn.net/qq_40303781/article/details/94380978