【引入】
适配,这个词语应该不陌生,经常出现在电学里面,家庭电压220V,但是我们的电器,例如手机的充电额定电压很低,电脑的充电电压也不同,但是却要使用同一个电源,适配器就能把电源变成所需要的电压,这就是电源适配器。
一、适配器模式
二、模式分类以及实现:
UML图:
【代码实现】
Adaptee(被适配类)
public class Adaptee {
public void SpecialRequest(){
System.out.println("特殊的请求!");
}
}
Adapter(适配器)
public class Adapter extends Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.SpecialRequest();
}
}
Target(客户期待的接口)
public class Target {
public void request(){
System.out.println("普通的请求");
}
}
Client类
public class Client {
public static void main(String[] args) {
Target target=new Adapter(new Adaptee());
target.request();
}
}
UML图:
【代码实现】
Adaptee(被适配类)
public class Adaptee {
public void specialRequest(){
System.out.println("特殊的请求!");
}
}
Adapter(适配器)
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
specialRequest();
}
}
Target(客户期待的接口)
public interface Target {
public void request();
}
Client类
public class Client {
public static void main(String[] args) {
Target target=new Adapter();
target.request();
}
}
总结:
三、场景举例
现在有一个现成的SortUtil类可以对整数进行排序,通过适配器实现可以对数字字符串排序。
SortUtil类(被适配类)
public class SortUtil {
public List sort(List<Integer> list){
Collections.sort(list);
return list;
}
}
Target类(客户希望的接口)
public interface Target {
public List sortString(List<String> list);
}
SortAdapter类
/**
* 对象适配器
*/
public class SortAdapter implements Target {
private SortUtil sortUtil;
public SortAdapter(SortUtil sortUtil){
this.sortUtil=sortUtil;
}
@Override
public List sortString(List<String> oldList) {
List<Integer> integerList1 = new ArrayList<Integer>();
List<String> newList = new ArrayList<String>();
for (String string : oldList) {
integerList1.add(Integer.parseInt(string.replaceAll("[^0-9]*", "")));
}
sortUtil.sort(integerList1);
for (Integer integer : integerList1) {
for (String stringList1 : oldList)
if (stringList1.contains(integer.toString())) {
newList.add(stringList1);
}
}
return newList;
}
}
四、JDK中适配器模式应用
在java JDK中,适配器模式使用场景很多,如集合包中java.util.Arrays#asList()、io包中java.io.InputStreamReader(InputStream)、java.io.OutputStreamWriter(OutputStream) 等。
Reader 类对应ClientTarget抽象类,InputStreamReader 类对应Adapter类, InputStream 对应Adaptee,Reader对应Target。InputStreamReader 将Reader 接口和InputStream 接口适配起来。
如果文章对你有用,三连支持一下吧!!!