先来聊一聊结构性模式。
我们都知道创建型模式有五个:单例模式,工厂模式,抽象工厂,原型模式,建造者模式
那结构型模式有七个:适配器模式,桥接模式,装饰模式,组合模式,外管模式,享元模式,代理模式。
我们先来看一看适配器模式吧
比如一个USB转换接口,我们笔记本必须要插入转换器。
如图:
现在大脑里应该有三个类了,一个网线接口类,一个笔记本类,还有一个USB转换类
先看代码:
先来写一个网线的类
public class Adaptee {
public void request(){
System.out.println("连接上网");
}
}
在写一个电脑的类
public class Computer {
public void net(NetToUsb adapter){
adapter.handRequest();
}
然后写一个接口转换器接口
//接口转换器的抽象实现
public interface NetToUsb {
//作用:处理请求 ==》usb
public void handRequest();
}
写一个适配器类
//真正的适配器 , 需要连接USB ,还有网线
public class Adapter extends Adaptee implements NetToUsb {
@Override
public void handRequest() {
super.request();//可以上网了
}
}
测试一下
public class Test {
public static void main(Stringp[] args){
//电脑,适配器,网线
Computer computer = new Computer();
Adaptee adaptee=new Adaptee();
Adapter adapter=new Adapter();
computer.net(adapter);
}
}
1.继承(类适配器,单继承)
2.组合(对象适配器:常用)
违反了我们的里氏替换原则
我们可以改进一下
//真正的适配器 , 需要连接USB ,还有网线
public class Adapter2 implements NetToUsb {
private Adaptee adaptee;
public Adapter2(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void handRequest() {
adaptee.request();//可以上网了
}
}
这里的测试就可以这样写
public static void main(String[] args) {
//电脑,适配器,网线
Computer computer = new Computer();
Adaptee adaptee=new Adaptee();
Adapter2 adapter=new Adapter2(adaptee);
computer.net(adapter);
}
这样我们效率极高
定义:
- 将一个类的接转换成客户希望的另一个接口。Apapter模式使得原本由于接口不兼容而不能一起工作的 那些类可以在一起工作
角色分析:
目标接口:客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口
需要适配的类:需要适配的类或适配者类
适配器:通过包装一个需要适配的对象,把原接口换成目标对象
下面图片是适配器模式的优点,缺点,以及应用场景