Java设计模式之--适配器模式

本文介绍了适配器模式的两种实现方式:类适配器和对象适配器。类适配器通过继承来实现适配,而对象适配器则采用组合的方式。通过示例代码展示了如何将现有类的服务转换为客户所需的接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供它所期望的接口。

类适配器


如上图所示,当我们需要适配现有代码时,可能会发现客户端开发人员已经事先考虑到这种情形。开发人员为客户端使用的服务提供了接口。该接口声明了Client类所要调用的requiredMethod方法。在ExistingClass类中,则定义了usefullMethod方法,它是Client类需要的实现。

若要对ExistingClass类进行适配,满足客户端对象的需要,就可以编写一个继承自ExistingClass,并同时实现RequiredInterface接口的类,通过重写requiredMethod方法将客户端的请求委派给usefullMethod方法。

以下通过代码进行说明:

  • Client
public class Client {
    
    private RequiredInterface requiredInterface;

    public Client(RequiredInterface requiredInterface){
        this.requiredInterface = requiredInterface;
    }
    //该方法为Client真正要完成的工作
    public void dosth(){
        this.requiredInterface.requiredMethod();
    }

}
  • Client依赖的接口类
public interface RequiredInterface {
    void requiredMethod();
}
  • 原有代码
public class ExistingClass {
    /**
     * 该方法可以实现Client端需要的功能
     */
    public void usefullMethod(){
        System.out.println("I'm the really usefull method the client need");
    }

}
  • 适配器
public class NewClass extends ExistingClass implements RequiredInterface {
    @Override
    public void requiredMethod() {
        this.usefullMethod();
    }
}

  • 测试类
public class App {
    public static void main( String[] args ){
        //构造适配器
        NewClass newClass = new NewClass();
        //客户端传入适配器
        Client client = new Client(newClass);
        client.dosth();
    }
}

以上的设计属于类的适配器,通过子类进行适配。在类的适配器中,新的适配器类实现了需要的接口,并继承自现有的类。当你需要适配的一组方法并非呗定义在接口中时,这种方式就不奏效了。

对象适配器

这种方式的适配器使用了委派而非继承。


如上所示,NewClass类是适配器的一个例子,该类的实例同时也是RequiredClass类的实例。换言之,NewClass类满足了客户端的需要。NewClass类通过ExistingClass实例对象,可以将ExistingClass类适配为符合客户端的需要。

  • Client
public class Client {

    private RequiredClass requiredClass;

    public Client(RequiredClass requiredClass){
        this.requiredClass = requiredClass;
    }
    //该方法为Client真正要完成的工作
    public void dosth(){
        this.requiredClass.requiredMethod();
    }

}
  • RequiredClass
public class RequiredClass {
    public void requiredMethod() {
        System.out.println("Telling you the truth, " +
                "I can not do what you actually want!");
    }
}
  • 适配器
public class NewClass extends RequiredClass{

    private ExistingClass existingClass;

    public NewClass(ExistingClass existingClass){
        this.existingClass = existingClass;
    }

    @Override
    public void requiredMethod() {
        this.existingClass.usefullMethod();
    }
}
  • 测试类
public class App {
    public static void main( String[] args ){
        ExistingClass existingClass = new ExistingClass();
        //构造适配器
        NewClass newClass = new NewClass(existingClass);
        //客户端传入适配器
        Client client = new Client(newClass);
        client.dosth();
    }
}


注意区分:类的适配器继承自现有的类,同时实现目标接口;对象适配器继承自目标类,同时引用现有的类;







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值