适配器模式Adapter
适配器概念
- 适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。
适配器模式存在意义
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
自己的语言描述: 接口A中有a()方法,接口B中有b()方法,接口规范定义只能操作A接口方法,如何通过操作A接口来实现b()方法的执行。(通过适配器实现)
实现原理
- 适配器实现核心是将类(想要操作的类)自己的接口包裹在一个已存在的类(适配器类)中。
适配器细分
- 类适配器模式–>通过继承来实现适配器功能。
- 对象适配器模式–>通过将自己的接口包裹在一个已存在的类中实现适配器功能。
- 接口适配器模式–>通过抽象类来实现适配,平庸地实现自己想要的目标方法。
适配器使用场景
- 类适配器与对象适配器的使用场景一致,二者主要用于如下场景:
(1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
(2)我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。
- 接口适配器使用场景:
(1)想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。这个抽象类就是适配器。
类适配器代码实现
/**
* USB A
*
* @title
* @description
* @since JDK1.8
*/
public interface Usba {
void useUsba();
}
/**
* USB A 实现类
*
* @title
* @description
* @since JDK1.8
*/
@Service
public class UsbaImpl implements Usba {
@Override
public void useUsba() {
System.out.println("我正在使用usba!!!");
}
}
/**
* USB B
*
* @title
* @description
* @since JDK1.8
*/
public interface Usbb {
void useUsbb();
}
/**
* USB B 实现类(适配器类)
*
* @title
* @description
* @since JDK1.8
*/
@Service
public class UsbbImpl extends UsbaImpl implements Usbb {
@Override
public void useUsbb() {
// 直接调用useUsba()方法
useUsba();
}
}
/**
* 测试类
* @title
* @description
* @since JDK1.8
*/
public class Test {
public static void main(String[] args) {
//UsbbImpl充当适配器角色
Usbb b = new UsbbImpl();
b.useUsbb();
// 打印结果:我正在使用usba!!!
}
}
对象适配器代码实现
/**
* 电源A
*
* @title
* @description
* @since JDK1.8
*/
public interface PowerA {
void insert();
}
/**
* 电源A的实现类
*
* @title
* @description
* @since JDK1.8
*/
@Service
public class PowerAimpl implements PowerA {
@Override
public void insert() {
System.out.println("电源A接口插入,开始工作了!!!");
}
}
/**
* 电源B
*
* @title
* @description
* @since JDK1.8
*/
public interface PowerB {
void insert();
}
/**
* 电源B实现类
*
* @title
* @description
* @since JDK1.8
*/
@Service
public class PowerBimpl implements PowerB {
@Override
public void insert() {
System.out.println("电源B插入,开始工作了!!!");
}
}
/**
* 适配器
*
* @title
* @description
* @since JDK1.8
*/
public class PoweraAdapter implements PowerA {
@Autowired
private PowerB powerB;
public PoweraAdapter(PowerB powerB) {
this.powerB = powerB;
}
@Override
public void insert() {
powerB.insert();
}
}
/**
* 测试类
*
* @title
* @description
* @since JDK1.8
*/
public class AdapterDemo {
public static void main(String[] args) {
PowerA a = new PowerAimpl();
a.insert();
PowerB b = new PowerBimpl();
PowerA pa = new PoweraAdapter(b);
pa.insert();
// 电源B插入,开始工作了!!!
}
}
接口适配器代码实现
/**
* 日常操作
*
* @title
* @description
* @since JDK1.8
*/
public interface LifeOperation {
void eat();// 吃饭
void drink();// 喝水
void play();// 玩
void work();// 工作
}
/**
* 抽象类(此处是适配器功能)
*
* @title
* @description
* @since JDK1.8
*/
public abstract class AbstractLifeOperation implements LifeOperation {
@Override
public void eat() {
System.out.println("吃饭");
}
@Override
public void drink() {
System.out.println("喝水");
}
@Override
public void play() {
System.out.println("玩耍");
}
@Override
public void work() {
System.out.println("工作");
}
}
/**
* 通过方法重写实现只执行自己想要的
*
* @title
* @description
* @since JDK1.8
*/
@Service
public class XiaomingLifeOperation extends AbstractLifeOperation {
@Override
public void eat() {
System.out.println("小明吃饭");
}
}
/**
* 测试类
*
* @title
* @description
* @since JDK1.8
*/
public class Test {
public static void main(String[] args) {
LifeOperation lo = new XiaomingLifeOperation();
lo.eat();
lo.drink();
lo.play();
lo.work();
// 小明吃饭
// 喝水
// 玩耍
// 工作
}
}