小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
概述
适配器模式是一种结构型设计模式,它能够将一个类的接口变换成客户端所期待的另一种接口,从而使得原本不兼容的对象能够相互合作。
角色
客户端:被转换对象,是包含了当前程序业务逻辑的类。
服务端:转换目标,通成来自第三方或遗留系统,接口与现有系统不兼容,且不能对其进行修改。
适配器:适配器模式的核心,实现客户端接口的同时封装了服务端对象,在接收客户端发起的调用后,将其转换为适用于被封装的服务对象后,对服务端发起调用。
模板
客户端:生产方形钉子的类
public class SquarePeg {
/**
* 半径
*/
private double radius;
public SquarePeg() {
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public SquarePeg(double radius) {
this.radius = radius;
}
}
复制代码
服务端:圆孔接口以及圆形的钉子
public class RoundHole {
/**
* 半径
*/
private double radius;
/**
* 判断钉子能否闯过圆孔
*/
public boolean fits(RoundPeg peg){
return getRadius() >= peg.getRadius();
}
public RoundHole() {
}
public RoundHole(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
复制代码
public class RoundPeg {
/**
* 半径
*/
private double radius;
public RoundPeg() {
}
public RoundPeg(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
复制代码
适配器:将方形钉子转换成圆形钉子
public class SquarePegAdapter extends RoundPeg{
private SquarePeg squarePeg;
public SquarePegAdapter(SquarePeg squarePeg) {
this.squarePeg = squarePeg;
}
@Override
public double getRadius() {
return squarePeg.getRadius() * Math.sqrt(2) / 2;
}
}
复制代码
结果:效果展示
public class AdapterPattern {
public static void main(String[] args) {
// 半径为5的圆孔
RoundHole hole = new RoundHole(5);
// 半径为5的圆钉
RoundPeg peg = new RoundPeg(5);
// 半径为5的方钉
SquarePeg squarePeg = new SquarePeg(5);
System.out.println("半径为5的圆形钉能否穿过半径为5的圆孔?" + hole.fits(peg));
// 入参类型异常
// System.out.println("半径为5的方形钉能否穿过半径为5的圆孔?" + hole.fits(squarePeg));
// 适配器
SquarePegAdapter squarePegAdapter = new SquarePegAdapter(squarePeg);
System.out.println("半径为5的方形钉能否穿过半径为5的圆孔?" + hole.fits(squarePegAdapter));
}
}
复制代码
小结
优点
单一原则:可以将接口或数据转换逻辑从程序主要业务逻辑中分离。
开闭原则:可在不修改客户端代码的情况下添加新的适配器,增强代码的灵活性。
缺点
复杂度增加,需要新增一系列接口和类。
适用场景
- 与历史遗留的类,第三方接口或提供其它接口的类之间对接需要进行转换的时候可使用适配器模式
- 缺少功能的对象需要动态获取所需功能时可使用适配器模式将该对象封装在适配器中,该方式与装饰模式类似
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!!!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!