理解
适配器模式所做的就是对接口的转换,如果想给手机充电,而现实是只有一个三孔插头,此时如果有一个插座肯定就解决了。因此适配器直接作用就是对接口的转换,适配成你现实需要的接口,而适配器是在原有类的基础上扩展出来的(有现成的三孔插头了,才能做适配),即也是为了对现有类方法的复用
适配器分为两种
- 类适配器
通过继承创建的适配器
- 对象适配器
通过组合创建的适配器
应用场景
-
- 系统想要使用现有类,而这些类的接口却不符合要求
- 两个类所做的事情相同或者相似,但是接口不同
设计原则
个人感觉适配器并没有体现出很有特点的设计原则,这个模式更像是编程思想的体现,使用设计模式可以让我们不改变原有组件的情况下实现对原有代码的复用,如果有现成的类可以复用,而只是接口差异的时候,建立适配器,比重新写类方便的多,再者通过适配器统一接口,可以让接口简洁,方便调用。
优点
- 实现对代码复用的同时总是能减少工作量
- 适配器可以规范统一的接口,让调用变的简单
- 适配器同时实现了目标类与适配者之间的解耦
类适配器和对象适配器的比较
两种适配器的差异是由于实现方式的不同而造成的,类适配器通过继承实现,而对象适配器则利用了组合,因此对象适配器比起类适配器更有弹性一些,而类适配器因为使用了继承,因此在适配器实现的过程中并不用完全实现适配者,而且还可以覆盖适配者
主要组成
目标角色(target) | 接口 |
源角色(adaptee) | 已有的实现类 |
适配器(adapter) | 将源转成目标 |
对象适配器
对象适配器类图
对象适配器源码
由于程序简单,因此没有把类拆出
package objectadapter_05;
public class TwoSocketAdaptee {//现成的类,有个两孔插座
public void two() {
System.out.println("这是两孔插座");
}
}
interface SocketTarget {//目标接口,需要一个三孔插座
public void three();
}
class SocketAdapter implements SocketTarget {
TwoSocketAdaptee tsa;
public SocketAdapter(TwoSocketAdaptee tsa) {
this.tsa = tsa;
}
public void three() {
tsa.two();//只是包装了两孔插座去实现三孔插座
}
}
客户端
package objectadapter_05;
public class Client {
public static void main(String[] args) {
TwoSocketAdaptee tsa=new TwoSocketAdaptee();
SocketTarget st=new SocketAdapter(tsa);
st.three();
}
}
测试结果
类适配器
类适配器类图
类适配器源码
由于程序简单,因此没有把类拆出
package classadapter_05;
public class TwoSocketAdaptee {
public void two(){
System.out.println("这是两孔插座");
}
}
interface SocketTarget {//不仅扩展了接口,而且对适配者 进行了覆盖
public void three();
public void two();
}
class SocketAdapter extends TwoSocketAdaptee implements SocketTarget{
public void three() {
System.out.println("这是三孔插座");
}
}
客户端
package classadapter_05;
class Client {
public static void main(String[] args) {
SocketTarget st=new SocketAdapter();
st.three();
st.two();
}
}
测试结果