适配器模式
将一个类的接口转换成客户希望的另一个接口,Adapter模式使得由于接口不兼容不能一起工作的那些类可以一起工作
角色分析
- 目标接口:客户所期待的接口(usb接口)
- 需要适配的类(网线接口)
- 适配器:包装一个需要适配的对象(包装网线),把原接口转换成目标对象(usb转接器)
对象适配器
-
一个对象适配器可以把多个不同的适配者适配到同一目标
-
可以适配适配者的子类
package com.guo; //要被适配的类:网线 public class Adaptee { public void request(){ System.out.println("连接网线上网"); } }
package com.guo; //真正的适配器 需要连接USB,连接网线 //适配器继承了网线,直接就有上网的功能 //1.继承:类适配器,一个类只能适配一个,因为单继承 //2.组合:对象适配器,常用 public class Adapter extends Adaptee implements NetToUsb{ @Override public void handlerequest() { super.request(); } }
package com.guo; //客户端类:想上网,插不上 public class Computer { //电脑需要来凝结上转接器才可以上网 public void net(NetToUsb adapter){ //上网的具体实现,找一个转接头 adapter.handlerequest(); } public static void main(String[] args){ //电脑、适配器、网线 Computer computer = new Computer(); //电脑 Adaptee adaptee = new Adaptee(); //网线 Adapter adapter = new Adapter(); //适配器 //Adapter2 adapter = new Adapter2(adaptee); //适配器 computer.net(adapter); } }
package com.guo; //接口转换器的抽象实现 public interface NetToUsb { //作用:处理请求,网线——usb public void handlerequest(); }
类适配器
- 一次做多只能适配一个适配者类,不能同时适配多个适配者
- 类适配器模式中的目标抽象类只能为接口
package com.guo;
//网线应该是接入进来的
//2.组合:对象适配器
public class Adapter2 implements NetToUsb{
private Adaptee adaptee;
//构造器里面传递
public Adapter2(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void handlerequest() {
adaptee.request();
}
}
package com.guo;
//客户端类:想上网,插不上
public class Computer {
//电脑需要来凝结上转接器才可以上网
public void net(NetToUsb adapter){
//上网的具体实现,找一个转接头
adapter.handlerequest();
}
public static void main(String[] args){
//电脑、适配器、网线
Computer computer = new Computer(); //电脑
Adaptee adaptee = new Adaptee(); //网线
Adapter adapter = new Adapter(); //适配器
//Adapter2 adapter = new Adapter2(adaptee); //适配器
computer.net(adapter);
}
}
GUI编程,存在大量适配器,否则要重写全部的方法