适配器模式(Adapter Pattern)属于结构型模式。作为两个不兼容的接口之间的桥梁,它结合了两个独立接口的功能。
角色:
1.目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
2.需要适配的类(Adaptee):需要适配的类或适配者类。
3. 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
实现原理:
适配器继承或依赖已有的对象,实现想要的目标接口。
优点
1.更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
2.透明、简单
客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单 & 更直接
3.更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
4.解耦性
将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码
5.符合开放-关闭原则
同一个适配器可以把适配者类和它的子类都适配到目标接口;可以为不同的目标接口实现不同的适配器,而不需要修改待适配类
缺点:
1.过多的使用适配器,会让系统非常零乱,不易整体进行把握
示例: https://www.cnblogs.com/milicool/p/11278617.html
背景:买了一个进口笔记本电脑
冲突:笔记本电脑需要的三项电源,和只提供的二项电源冲突
解决方案:设置一个适配器二项充电口转化为三项充电口
1、Adaptee 原有的类 提供二项电
/**
* 插头 二项供电 Adaptee
*/
public class TwoPower {
public void powerByTwo() {
System.out.println("提供二项供电");
}
}
2、Target 目标类 能输出三项供电
/**
* 插头提供三项供电 (target)
*/
public interface ThreePower {
/**
* 三项供电
*/
void powerByThree();
}
3、对象适配器,转换类 Adapter
/**
* 二项转三项的适配器 组合的方式 对象适配器
*/
public class TwoToThreeAdapter implements ThreePower{
/**
* 使用委托来完成适配
*/
private TwoPower twoPower;
public TwoToThreeAdapter(TwoPower twoPower) {
this.twoPower = twoPower;
}
@Override
public void powerByThree() {
System.out.println("借助组合适配器转化二项电");
twoPower.powerByTwo();
}
}
4、 类适配器 转换类 Adapter
/**
* 二项转三项的适配器 继承的方式 类
*/
public class TwoToThreeAdapter2 extends TwoPower implements ThreePower {
@Override
public void powerByThree() {
System.out.println("借助继承适配器转化二项电");
this.powerByTwo();
}
}
Test
/**
* 笔记本电脑 这是使用组合模式的-适配器模式
*/
public class NoteBook {
/**
* 期望的三项供电接口
*/
private ThreePower threePower;
public NoteBook(ThreePower threePower) {
this.threePower = threePower;
}
public static void main(String[] args) {
// ============================ 继承方式的适配器使用 类适配器 =====================================
ThreePower threePower1 = new TwoToThreeAdapter2();
NoteBook noteBook1 = new NoteBook(threePower1);
noteBook1.recharge();
noteBook1.work();
// ============================ 组合方式的适配器使用 对象适配器 =====================================
// 现在只有二项供电
TwoPower twoPower = new TwoPower();
ThreePower threePower = new TwoToThreeAdapter(twoPower);
NoteBook noteBook = new NoteBook(threePower);
// 1. 充电
noteBook.recharge();
// 2. 工作
noteBook.work();
}
public void work() {
System.out.println("笔记本电脑开始工作!");
}
public void recharge() {
// 使用三项充电
threePower.powerByThree();
}
}控制台显示:
提供二项供电 借助继承适配器转化二项电 笔记本电脑开始工作!
提供二项供电 借助组合适配器转化二项电 笔记本电脑开始工作!