ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-27 23:32:24  阅读:193  来源: 互联网

标签:Adapter Target 适配 适配器 模式 Adaptee 设计模式 public


【引入】

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


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

标签:Adapter,Target,适配,适配器,模式,Adaptee,设计模式,public
来源: https://blog.csdn.net/m0_46013789/article/details/122724508

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有