了解23种设计模式之适配器模式

一,什么是 适配器模式

Adapter 模式 也叫适配器模式, 是构造型模式之一,通过Adapter 模式可以改变已有类(或外部类) 的接口形式 。

 

二,适配器模式的定义与特点以及结构

定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

优点:

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

缺点:对类适配器来说,更换适配器的实现过程比较复杂。

适配器模式(Adapter)包含以下主要角色。

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

类适配器模式  通过继承实现Adapter

对象适配器模式,通过委让实现Adapter

 

三,代码实现

类适配器:

目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。

将使用的电源抽象

public interface Current {

    /**
     * 使用电源
     */
    public void voltage();
}

适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。

这里是笔记本适配者

public class Adaptee {

    public void user220V(){
        System.out.print("适配220V电压");
    }
}

适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

public class Adapter extends Adaptee implements Current{

    @Override
    public void voltage(){
       System.out.println("笔记本电脑使用");
       super.user220v();
    }
}

测试:

public class MainClass {
    public static void main(String[] args) {
            Adapter adapter = new Adapter();
            adapter.user220v();
    }
}

 对象适配器模式,通过委让实现Adapter

目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。

将使用的电源抽象

public interface Current {

    /**
     * 使用电源
     */
    public void voltage();
}

 

适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。

这里是适配者 提供各种电压

public class Adaptee {

    public void user220V(){
        System.out.print("适配220V电压");
    }
}

 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

public class Adapter implements Current{
    private  Adaptee adaptee;

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

    @Override
    public void voltage(){
        System.out.println("笔记本电脑使用");
        adaptee.user220V();
    }
}

测试:

public class MainClass {
    public static void main(String[] args) {
            Adaptee adaptee = new Adaptee();
            Adapter adapter = new Adapter(adaptee);
            adapter.voltage();
    }
}

四,应用场景

  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

五,模式的扩展

适配器模式(Adapter)可扩展为双向适配器模式,双向适配器类既可以把适配者接口转换成目标接口,也可以把目标接口转换成适配者接口

目标接口
/**
 * target(目标) 发动机
 */
public interface Motor {

    //驾驶
    public void drive();
}

适配者接口 

/**
 * @ClassName Engine 
 * @Description 引擎(适配者接口)
 * @Version 1.0
 **/
public interface Engine {

    /**
     * 引擎
     */
   public void  engine();

目标实现 

/**
 * @ClassName OpticalMotor
 * @Description (目标实现)
 * @Version 1.0
 **/
public class GtrMotor implements Motor{

    @Override
    public void drive() {
        System.out.print("GTR跑车发动机");
    }
}

适配者实现

/**
 * @ClassName ElectricMotor
 * @Description  (适配者实现)
 * @Version 1.0
 **/
public class ElectricEngine implements Engine{

    /**
     * 电动驱动
     */
    @Override
    public void engine(){
        System.out.println("是v12自然吸气发动机!");
    }
}

双向适配器

public class Adapter implements Motor,Engine{
    private Motor motor;
    private Engine electric;

    public Adapter(Motor motor, Engine electricAdapter) {
        this.motor = motor;
        this.electric = electricAdapter;
    }

    @Override
    public void drive() {
        this.motor.drive();
    }

    @Override
    public void engine() {
        this.electric.engine();
    }
}

 测试

public class MainClass {
    public static void main(String[] args) {
            /*Adaptee adaptee = new Adaptee();
            Adapter adapter = new Adapter(adaptee);
            adapter.voltage();*/

         Motor motor = new GtrMotor();
         Engine electric = new ElectricEngine();
         Adapter twoWayAdapter = new Adapter(motor,electric);
         twoWayAdapter.drive();
         twoWayAdapter.engine();
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可乐cc呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值