目录
一:适配器模式
前面我们说明了设计模式中创建型模式,其中创建型模式中使用较多的就是工厂模式和单例模式。现在我么就来说说java设计模式中的结构模式,结构模式中的最基本的模式就是适配器模式,其他模式都是基于适配器模式进行扩展。我看了一下许多对于适配器的定义为:
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
好吧,对于这个定义的理解有点拗口,其实在实际生产中PO转VO就是一个很好的应用,可以简而言之,就是将我们内部方法改造以提供服务外部需求的接口。
从上述的一段话中我们可以看出设计到3个东西,一是我们内部的方法,二是对外的接口,三是接口的实现以完成内部方法的改造
然后进行官方的说明:
源(Adaptee):需要适配的对象(这里不限于对象)相当于上面的我们内部的方法。
目标(Target):完成适配的目标,这里就是对外的接口。
适配器(Adapter):转化的过程,就是上面的接口的实现。
然后一幅图说明:
适配器模式分为3种:类适配器模式,对象适配器模式,接口适配器模式(又叫缺省模式)
二:类适配器模式
1.内部方法(有参构造法---源)
package test.com;
public class USB {
public void isUsb() {
System.err.println("this is a use interface");
}
}
2.目的(改造user的现实方法)
package test.com;
public interface PS2 {
void isPS2();
}
3.适配器(继承内部方法,实现目的接口 --适配器)
package test.com;
public class Adapter1 extends USB implements PS2{
@Override
public void isPS2() {
super.isUsb();
}
}
4.测试
package test.com;
public class test {
public static void main(String[] args) {
PS2 ps2=new Adapter1();
ps2.isPS2();
}
}
5.说明
其实类的适配器就是继承了内部方法,并且实现对外接口,在其中做一些匹配,用到这种思想最多的场景就是我们po转vo了。
优点:将对外接口和内部方法解耦,复用性更强,可替换性也强。
缺点:一次只能继承一个。无法实现该内部方法的子类方法。
6.实际场景
(1)jdbc的链接
(2)aop中通知类型适配等
二:对象适配器模式
1.适配器(其他的不变)
package test.com;
public class Adapter2 implements PS2{
private USB usb;
public Adapter2(USB usb) {
this.usb=usb;
}
@Override
public void isPS2() {
usb.isUsb();
}
}
2.测试
package test.com;
public class test {
public static void main(String[] args) {
PS2 ps2_1 = new Adapter2(new USB());
ps2_1.isPS2();
}
}
3.类和对象适配器的比对
(1)首先来比对方法核心
其本质区别就是在初始化目标类对象的时间:(1)类模式是在转换器中进行实例化的,而对象模式是在客户端实例化在转换器中进行引用,由此引出第二个区别。(2)对象模式可以转换对应类的子类对象。
三:接口适配器
1.说明:
接口适配器适用于转化接口方法(有多个方法)但是只需要实现其中部分方法。
2.目标
package test.com;
public interface PS2 {
void isPS2();
void isPS1();
void isPS0();
}
3.抽象适配器
package test.com;
public abstract class Adapter3 extends USB implements PS2{
@Override
public void isPS2() {
super.isUsb();
}
@Override
public void isPS1() {
System.err.println("1");
}
@Override
public void isPS0() {
System.err.println("2");
}
}
4.具体适配器
package test.com;
public class Adapter5 extends Adapter3{
@Override
public void isPS2() {
super.isUsb();
}
}
四:总结
适配器模式可以使代码具有很好的扩展性,复用性,但是同时也带来了代码交叉性等麻烦。