【大话设计模式】模式五:适配器模式

【引入】

        适配,这个词语应该不陌生,经常出现在电学里面,家庭电压220V,但是我们的电器,例如手机的充电额定电压很低,电脑的充电电压也不同,但是却要使用同一个电源,适配器就能把电源变成所需要的电压,这就是电源适配器。

一、适配器模式

        适配器模式(Adapter)将一个类的接口转换成客户希望的另外的一个接口。Adapte模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。                

二、模式分类以及实现:

1、对象适配器:松耦合

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();
    }
}

2、类适配器:高耦合

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();
    }
}

总结: 

         类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。而且由于类适配器通过多重继承对接口与另一个接口进行匹配,而Java等语言不支持多重继承,所以多用对象适配器。

        适配器模式将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构,  增加了类的透明性和复用性。
适用场景:系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。

三、场景举例

 现在有一个现成的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 接口适配起来。

【大话设计模式】模式五:适配器模式

【大话设计模式】模式五:适配器模式


 如果文章对你有用,三连支持一下吧!!!

上一篇:34. 在排序数组中查找元素的第一个和最后一个位置(LeetCode)


下一篇:二分搜索