0
点赞
收藏
分享

微信扫一扫

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

【引入】

        适配,这个词语应该不陌生,经常出现在电学里面,家庭电压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 接口适配起来。


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

举报

相关推荐

0 条评论