⭐️适配器模式
适配器模式就是将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
☑️模式中的角色
-
目标接口(Target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。(我们想要的)
-
需要适配的类(Adaptee):需要适配的类或适配者类(我们有的)
-
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
☑️实现方式:
-
类适配器(采用继承实现)
-
对象适配器(采用对象组合方式实现)
⭕️类适配器
/**
* 目标接口
*/
interface Target {
void specialWork();
}
/**
* 目标类
*/
class ConcreteTarget implements Target {
@Override
public void specialWork() {
System.out.println("特殊功能");
}
}
/**
* 适配者
*/
class Adaptee {
void work() {
System.out.println("普通功能");
}
}
/**
* 适配器
*/
class Adapter extends Adaptee implements Target {
@Override
public void specialWork() {
super.work();
//todo
}
}
public class Client {
public static void main(String[] args) {
Target concreteTarget = new ConcreteTarget();
concreteTarget.specialWork();
Target adapter = new Adapter();
adapter.specialWork();
}
Adapter 类既继承了 Adaptee,也实现了 Target 接口,在 Client类中我们可以根据需要选择并创建任一种符合需求的子
类,来实现具体功能
⭕️对象适配器
/**
* 目标接口
*/
interface Target {
void specialWork();
}
/**
* 目标类
*/
class ConcreteTarget implements Target {
@Override
public void specialWork() {
System.out.println("目标功能");
}
}
/**
* 适配者
*/
class Adaptee {
void work() {
System.out.println("适配者功能");
}
}
/**
* 适配器
*/
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void specialWork() {
adaptee.work();
//todo
}
}
public class Client {
public static void main(String[] args) {
Target concreteTarget = new ConcreteTarget();
concreteTarget.specialWork();
Target adapter = new Adapter(new Adaptee());
adapter.specialWork();
}
Adapter 自身必须先拥有一个被适配类的对象,再把被适配类具体的功能委托给这个对象来实现。使用对象适配器模式,可以使得
Adapter 类(适配类)根据传入的 Adaptee 对象达到适配多个不同被适配类的功能。所以对象适配器相对于类适配器比较灵活,对
象适配器可以根据传入的 Adaptee 对象适配多个不同被适配类的功能。
☑️模式总结
优点
- 模式最大的作用还是将原本不兼容的接口融合在一起工作。
- 将目标类和适配者类解耦,通过引入一个适配器类重写现有的适配者类,而无需修改原有代码。
- 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
缺点
- 对于对象适配器来说,更换适配器的实现过程比较复杂。
适用场景
- 系统需要使用现有的类,而这些类的接口不符合系统的接口。
- 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
- 两个类所做的事情相同或相似,但是具有不同接口的时候。
- 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
- 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。