XML、XML解析、设计模式等课程安排

课程安排

java中xml丢失 maven java中xml文件是干什么的_xml

XML

XML 概述

  • XML是可扩展标记语言(eXtensible Markup Language)的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用与传输和存储数据。

XML的几个贴点和使用场景

  • 一是纯文本,默认使用 UTF-8 编码;二是可嵌套;
  • 如果把 XML 内容存为文件,那么它就是一个 XML 文件。
  • XML 的使用场景:XML内容经常被当成消息进行网络传输,挥着作为配置文件用于存储系统的消息。

java中xml丢失 maven java中xml文件是干什么的_java中xml丢失 maven_02

总结

  1. XML是什么?
  • XML 的全称为(EXtensible Markup Language),是一种可扩展的标记语言。
  • 它是一种数据表示格式,可以用于自定义数据格式。
  1. XML 的作用是什么?
  • 用于进行存储数据和传输数据
  • 作为软件的配置文件

XML 的创建、语法规则

XML 的 创建

  • 就是创建一个 XML 类型的文件,要求文件的后缀必须使用 xml,如 hello_world.xml

IDEA 创建 XML 文件的操作步骤

java中xml丢失 maven java中xml文件是干什么的_java中xml丢失 maven_03

XML 的语法规则

  • XML 文件的后缀名为:xml
  • 文档声明必须是第一行

XML 的标签(元素)规则

  • 标签由一对尖括号和合法标识符组成:,必须存在一个根标签,有且只能有一个。
  • 标签必须成对出现,又开始,有结束:
  • 特殊的标签可以不成对,但是必须有结束标记,如:
  • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
  • 标签需要正确的嵌套

XML 的 其他组成

  • XML 文件汇总可以定义注释信息:
  • XML 文件中可以存在以下特殊字符
  • XML 文件中可以存在 CDATA 区:<![CDATA[ …内容… ]]],快捷键:CD + 回车
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:根标签有且仅能有一个 -->
<!--
    <   < 小于
    >   > 大于
    &  & 和号
    ' ' 单引号
    " " 引号
    <![CDATA[ …任意内容… ]]>   快捷键:CD
 -->
<student>
    <name>女儿国王</name>
    <sex>女</sex>
    <hobby>唐僧,追唐僧</hobby>
    <info>
        <age>30</age>
        <addr>女儿国</addr>
    </info>
    <spl>
        select * from user where age < 18
        select * from user where age < 18 && age ">> 10
        <![CDATA[
           select * from user where age < 18
        ]]>
    </spl>
</student>

总结

  1. XML 的组成格式要求是什么样的?
  • 文件后缀必须是 xml
  • 文档声明必须是第一行
  • 必须存在一个根标签,有且只能有一个
  • XML 文件中可以定义注释信息:
  • 标签必须成对出现,有开始,有结束标签:
  • 必须能够正确的嵌套

XML 文档约束方式一:DTD约束[了解]

什么是文档约束

java中xml丢失 maven java中xml文件是干什么的_xml_04

问题:由于 XML 文件可以自定义标签,导致 XML 文件可以随意定义,程序在解析的时候可能出现问题。

java中xml丢失 maven java中xml文件是干什么的_设计模式_05

文档约束的分类

  • DTD
  • schema

步骤 XML 文档约束 - DTD 的使用(了解)

需求:利用 DTD 文档约束,约束一个 XML 文件的编写。

分析:

  1. 编写 DTD 约束文件,后缀必须是 .dtd
  2. 在需要编写的 XML 文件中导入该 DTD 约束文档
  3. 按照约束的规定编写 XML 文件的内容。

data.dtd

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

hello_world_dtd.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架>
    <书>
        <书名>精通JavaSE加强</书名>
        <作者>自我自律</作者>
        <售价>88</售价>
    </书>
    <书>
        <书名></书名>
        <作者></作者>
        <售价>很贵</售价>
    </书>
</书架>

总结

  1. XML 的文档约束 - DTD的作用和问题?
  • 可以约束 XML 文件的编写。
  • 不能约束具体的数据类型。

XML 文档约束方式二:schema约束[了解]

文档约束 - schema

  • schema 可以约束具体的数据类型,约束能力上更强大。
  • schema 本身也是一个 xml 文件,本身也受到其他约束文件的要求,所以编写的更加严谨。

步骤 XML 文档约束 - schema 的使用(了解)

需求:利用 schema 文档约束,约束一个 XML 文件的编写。

分析:

  1. 编写 schema 约束文档,后缀必须是 .xsd,具体的形式到代码中观看。
  2. 在需要编写的 XML 文件中导入该 schema 约束文档
  3. 按照约束内容编写 XML 文件的标签。

data.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.zwzl.cn"
        elementFormDefault="qualified">
        <!--  targetNamespace:申明的约束文档的地址(命名空间)  -->
    <element name="书架">
        <!-- 写子元素 -->
        <complexType>
            <!-- maxOccurs="unbounded":书架下的子元素可以有任意多个! -->
            <sequence maxOccurs="unbounded">
                <element name="书">
                    <!-- 写子元素 -->
                    <complexType>
                        <sequence>
                            <element name="书名" type="string"/>
                            <element name="作者" type="string"/>
                            <element name="售价" type="double"/>
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>

hello_world_schema.xml

<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="http://www.zwzl.cn"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.zwzl.cn data.xsd">
    <!-- xmlns="http://www.zwzl.cn" 基本位置
         xsi:schemaLocation="http://www.zwzl.cn data.xsd" 具体位置
         -->
    <书>
        <书名>《神雕侠侣》</书名>
        <作者>金庸</作者>
        <售价>399.9</售价>
    </书>
</书架>

总结

  1. XML 的文档约束 - schema 的优点?
  • 可以约束 XML 文件的标签内容格式,以及具体的数据类型。

XML解析技术

XML 解析技术概述

  1. XML 的数据的作用是什么,最终需要怎么处理?
  • 存储数据、做配置信息、进行数据传输。
  • 最终需要被程序进行读取,解析里面的信息。

什么是 XML 解析

  • 使用程序读取 XML 中的数据

两种解析方法

  • SAX 解析
  • DOM 解析

Dom 常见的解析工具

java中xml丢失 maven java中xml文件是干什么的_java中xml丢失 maven_06

DOM 解析解析文档对象模型

java中xml丢失 maven java中xml文件是干什么的_XML_07

总结

  1. Dom 解析的文档对象模型是什么样的?
  2. Dom 解析常用技术框架
  • Dom4J

Dom4J 解析 XML 文件

步骤 使用 Dom4J 解析出 XML 文件

需求:使用 Dom4J 把一个 XML 文件的数据进行解析

分析:

  1. 下载 Dom4J 框架,官网下载。
  2. 在项目中创建一个文件夹:lib
  3. 将 dom4j-2.1.1.jar 文件复制到 lib 文件夹
  4. 在 jar 文件上点右键,选择 Add as Library -> 点击 OK
  5. 在类中导包使用

java中xml丢失 maven java中xml文件是干什么的_java中xml丢失 maven_08

Contacts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<contactList>
    <contact id="1" vip="true">
        <name>张三</name>
        <gender>男</gender>
        <email>zhangsan@136.com</email>
    </contact>
    <contact id="2" vip="false">
        <name>李四</name>
        <gender>男</gender>
        <email>lisi@qq.com</email>
    </contact>
    <contact id="3" vip="false">
        <name>王花</name>
        <gender>女</gender>
        <email>wanghua@136.com</email>
    </contact>
    <user>
    </user>
</contactList>

Dom4JHelloWorldTest1

/**
 * @author : gxd
 * @date : 2022/7/26 23:16
 * 目标:学会使用 Dom4J 解析 XML 文件中的数据。
 * 1、导入 dom4j 框架。
 * 2、准备一个 XML 文件。
 */
public class Dom4JHelloWorldTest1 {
    @Test
    public void parseXMLData() throws Exception {
        //1、创建一个 Dom4J 的解析器对象,代表了整个 Dom4J 框架
        SAXReader saxReader = new SAXReader();
        //2、把 XML文件加载到内存中成为一个 Document 文档对象
        //Document document = saxReader.read(new File("xml-app/src/Contacts.xml"));//需要通过模块名定位
        //Document document = saxReader.read(new FileInputStream("xml-app/src/Contacts.xml"));
        //以上两种方式不太好,因为是通过模块名定位,模块名一旦发生改变就找不到了。

        //注意:getResourceAsStream中的/是直接去 src 寻找的文件
        InputStream is = Dom4JHelloWorldTest1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        //3、获取根元素对象
        Element root = document.getRootElement();
        System.out.println(root.getName());
    }
}

Dom4J 解析 XML -得到 Document 对象

java中xml丢失 maven java中xml文件是干什么的_XML_09

Dom4J 解析 XML 文件中的各种节点

Dom4j 解析 XML 的元素、属性、文本

java中xml丢失 maven java中xml文件是干什么的_设计模式_10

Contacts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<contactList>
    <contact id="1" vip="true">
        <name>  张三  </name>
        <gender>男</gender>
        <email>zhangsan@136.com</email>
    </contact>
    <contact id="2" vip="false">
        <name>李四</name>
        <gender>男</gender>
        <email>lisi@qq.com</email>
    </contact>
    <contact id="3" vip="false">
        <name>王花</name>
        <gender>女</gender>
        <email>wanghua@136.com</email>
    </contact>
    <user>
    </user>
</contactList>

Dom4JHelloWorldTest1

/**
 * @author : gxd
 * @date : 2022/7/26 23:16
 * 目标:学会使用 Dom4J 解析 XML 文件中的数据。
 * 1、导入 dom4j 框架。
 * 2、准备一个 XML 文件。
 */
public class Dom4JHelloWorldTest1 {
    @Test
    public void parseXMLData() throws Exception {
        //1、创建一个 Dom4J 的解析器对象,代表了整个 Dom4J 框架
        SAXReader saxReader = new SAXReader();
        //2、把 XML文件加载到内存中成为一个 Document 文档对象
        //Document document = saxReader.read(new File("xml-app/src/Contacts.xml"));//需要通过模块名定位
        //Document document = saxReader.read(new FileInputStream("xml-app/src/Contacts.xml"));
        //以上两种方式不太好,因为是通过模块名定位,模块名一旦发生改变就找不到了。

        //注意:getResourceAsStream中的/是直接去 src 寻找的文件
        InputStream is = Dom4JHelloWorldTest1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        //3、获取根元素对象
        Element root = document.getRootElement();
        System.out.println(root.getName());

        //4、拿根元素下的全部子元素对象(一级)
        //List<Element> sonELes = root.elements();
        List<Element> sonELes = root.elements("contact");
        for (Element sonELe : sonELes) {
            System.out.println(sonELe.getName());
        }
        //拿某个子元素
        Element userEle = root.element("user");
        System.out.println(userEle.getName());
        //默认提取第一个元素对象
        Element contact = root.element("contact");
        //获取子元素文本
        System.out.println(contact.elementText("name"));
        //去掉前后空格
        System.out.println(contact.elementTextTrim("name"));
        //获取当前元素下的子元素对象
        Element email = contact.element("email");
        System.out.println(email.getText());

        //根据元素获取属性值
        Attribute idAttr = contact.attribute("id");
        System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
        //直接提取属性值
        System.out.println(contact.attributeValue("id"));
        System.out.println(contact.attributeValue("vip"));
    }
}

总结

  1. Dom4J的解析思想?
  • 得到文档对象 Document,从中获取元素对象和内容。

Dom4J 解析 XML 文件-案例实战

案例 XML 解析案例

需求:利用 Dom4J 的知识,将 Contact.xml 文件中的联系人数据封装成 List 集合,其中每个元素是实体类 Contact。打印输出List 中的每个元素。

java中xml丢失 maven java中xml文件是干什么的_设计模式_11

Contacts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<contactList>
    <contact id="1" vip="true">
        <name>  张三  </name>
        <gender>男</gender>
        <email>zhangsan@136.com</email>
    </contact>
    <contact id="2" vip="false">
        <name>李四</name>
        <gender>男</gender>
        <email>lisi@qq.com</email>
    </contact>
    <contact id="3" vip="false">
        <name>王花</name>
        <gender>女</gender>
        <email>wanghua@136.com</email>
    </contact>
    <user>
    </user>
</contactList>

Dom4JHelloWorldTest1

/**
 * @author : gxd
 * @date : 2022/7/27 0:08
 * 目标: Dom4J 解析 XML 文件-案例实战
 *
 * 案例 XML 解析案例
 *
 * 需求:利用 Dom4J 的知识,将 Contact.xml 文件中的联系人数据封装成 List 集合,其中每个元素是实体类 Contact。打印输出List 中的每个元素。
 */
public class Dom4JTest2 {
    @Test
    public void parseToList() throws Exception{
        //1、导入框架(做过)
        //2、创建 SaxReader 对象
        SAXReader saxReader = new SAXReader();
        //3、加载 XML 文件成为文档对象 Document 对象。
        Document document = saxReader.read(Dom4JTest2.class.getResourceAsStream("/Contacts.xml"));
        //4、拿到跟元素
        Element root = document.getRootElement();
        //5、提取 contact 子元素
        List<Element> contactEles = root.elements("contact");
        //6、准备一个 ArrayList 集合封装联系人信息
        List<Contact> contactList = new ArrayList<>();
        //7、遍历 Contact 子元素
        for (Element contactEle : contactEles) {
            //8、每个子元素都是一个联系人对象
            Contact contact = new Contact();
            contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
            contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
            contact.setName(contactEle.elementTextTrim("name"));
            contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
            contact.setEmail(contactEle.elementText("email"));
            //9、把联系人对象数据加入到 List 集合
            contactList.add(contact);
        }
        //10、遍历 List 集合
        for (Contact contact : contactList) {
            System.out.println(contact);
        }
    }
}

XML检索技术:Xpath

回顾

如果需要从 XML 文件汇总检索需要的某个信息(如 name)怎么解决?

  • Dom4J 需要进行文件的全部解析,然后再寻找数据。
  • Xpath 技术更加适合做信息检索。

XPath 介绍

  • XPath 在解析 XML 文档方面提供了一独树一帜的路径思想,更加优雅,高效。
  • XPath 使用路径表达式来定位 XML 文档中的元素节点或属性节点。

示例

  • /元素/子元素/孙元素
  • //子元素//孙元素

步骤 使用 Xpath 检索出 XML 文件

需求:使用 Dom4J 把一个 XML 文件的数据进行分析

分析:

  1. 导入 jar 包(dom4j 和 jaxen-1.1.2.jar),Xpath 技术依赖 Dom4J 技术
  2. 通过 dom4j 的 SAXReader 获取 Document 对象
  3. 利用 XPath 提供的 API,结合 XPath 的语法完成选取 XML 文档元素节点进行解析操作。
  4. Document 中与 Xpath 相关的 API 如下:

Contacts2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<contactList>
    <contact id="1" vip="true">
        <name>张三</name>
        <gender>男</gender>
        <email>zhangsan@136.com</email>
    </contact>
    <contact id="2" vip="false">
        <name>李四</name>
        <gender>男</gender>
        <email>lisi@qq.com</email>
    </contact>
    <contact id="3" vip="false">
        <name>王花</name>
        <gender>女</gender>
        <email>wanghua@136.com</email>
    </contact>
    <user>
        <contact>
            <info>
                <name id="888">我是罗老师</name>
            </info>
        </contact>
    </user>
</contactList>

XPathTest

/**
 * @author : gxd
 * @date : 2022/7/27 22:21
 * 目标:学习 XML检索技术:Xpath
 * 步骤 使用 Xpath 检索出 XML 文件
 *
 * 需求:使用 Dom4J 把一个 XML 文件的数据进行分析
 *
 * 分析:
 * 1. 导入 jar 包(dom4j 和 jaxen-1.1.2.jar),Xpath 技术依赖 Dom4J 技术
 * 2. 通过 dom4j 的 SAXReader 获取 Document 对象
 * 3. 利用 XPath 提供的 API,结合 XPath 的语法完成选取 XML 文档元素节点进行解析操作。
 * 4. Document 中与 Xpath 相关的 API 如下:
 *    - Node selectSingleNode("表达式");:获取符合表达式的唯一元素
 *    - List<Node> selectNodes("表达式") :获取符合表达式的元素结合
 */
public class XPathTest {
    /**
     * 1、绝对路径:/根元素/子元素/子元素
     */
    @Test
    public void parse1() throws Exception {
        //a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b、把 XML 加载成 Document 文档对象
        Document document = saxReader.read(XPathTest.class.getResourceAsStream("/Contacts2.xml"));
        //c、检索全部的名称
        List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
        for (Node nameNode : nameNodes) {
            Element element = (Element) nameNode;
            System.out.println(element.getTextTrim());
        }
    }

    /**
     * 2、相对路径 ./子元素/子元素(.代表了当前元素)
     */
    @Test
    public void parse2() throws Exception {
        //a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b、把 XML 加载成 Document 文档对象
        Document document = saxReader.read(XPathTest.class.getResourceAsStream("/Contacts2.xml"));
        Element root = document.getRootElement();
        //c、检索全部的名称
        List<Node> nameNodes = root.selectNodes("./contact/name");
        for (Node nameNode : nameNodes) {
            Element element = (Element) nameNode;
            System.out.println(element.getTextTrim());
        }
    }

    /**
     * 3、全文搜索:
     * //元素  在全文中找这个元素
     * //元素1/元素2 在全文找元素1 下面的一级元素2
     * //元素1//元素2 在全文找元素1 下面的全部元素2
     */
    @Test
    public void parse3() throws Exception {
        //a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b、把 XML 加载成 Document 文档对象
        Document document = saxReader.read(XPathTest.class.getResourceAsStream("/Contacts2.xml"));
        //c、检索全部的名称
        //List<Node> nameNodes = document.selectNodes("//name");
        //List<Node> nameNodes = document.selectNodes("//contact/name");
        List<Node> nameNodes = document.selectNodes("//contact//name");
        for (Node nameNode : nameNodes) {
            Element element = (Element) nameNode;
            System.out.println(element.getTextTrim());
        }
    }

    /**
     * 4、属性查找
     * //@属性名称 在全文检索属性对象
     * //元素[@属性名称] 在全文检索包含属性的元素对象
     * //元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象。
     */
    @Test
    public void parse4() throws Exception {
        //a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        //b、把 XML 加载成 Document 文档对象
        Document document = saxReader.read(XPathTest.class.getResourceAsStream("/Contacts2.xml"));
        //c、检索全部的名称
        List<Node> nodes = document.selectNodes("//@id");
        for (Node node : nodes) {
            Attribute attribute = (Attribute) node;
            System.out.println(attribute.getName() + "===>" + attribute.getValue());
        }

        //查询 name 元素(包含 id 属性的)
        //Node node = document.selectSingleNode("//name[@id]");
        Node node = document.selectSingleNode("//name[@id=888]");
        Element element = (Element) node;
        System.out.println(element.getTextTrim());
    }
}

Xpath 的四大检索方案

  • 绝对路径
  • 相对路径
  • 全文检索
  • 属性查找

XPath:绝对路径

  • 采用绝对路径获取从根节点开始逐层的查找 /contactList/contact/name 节点列表并打印信息

Xpath:相对路径

  • 先得到根节点contactList
  • 在采用相对路径获取下一级contact 节点的 name 子节点并打印信息

XPath:全文搜索

  • 直接全文搜索所有的 name 元素并打印

XPath:属性查找

  • 在全文中搜索属性,或者带属性的元素

总结

  1. Xpath 作用,四大类。
  • 检索 XML 文件中的信息
  • 绝对路径:/根元素/子元素/孙元素
  • 相对路径:./子元素/孙元素
  • 全文检索://contact
  • 属性查找://@属性名、//元素[@属性名]、//元素//[@属性名=‘值’]

设计模式:工厂模式

什么是工厂设计模式?

  • 之前我们创建类对象时,都是使用 new 对象的形式创建,在很多业务场景下也提供了不直接 new 的方式。
  • 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。

工厂设计模式的作用:

  • 工厂的方法可以封装对象的创建的细节,比如:为该对象进行加工和数据注入。
  • 可以实现类与类之间的解耦操作(核心思想)。

工厂模式 例子

Computer

/**
 * @author : gxd
 * @date : 2022/7/27 23:07
 */
public abstract class Computer {
    private String name;
    private double price;

    public abstract void start();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

Huawei

/**
 * @author : gxd
 * @date : 2022/7/27 23:12
 */
public class Huawei extends Computer{
    @Override
    public void start() {
        System.out.println(getName() + "开机了,展示了华为的菊花图标!");
    }
}

Mac

/**
 * @author : gxd
 * @date : 2022/7/27 23:10
 */
public class Mac extends Computer{
    @Override
    public void start() {
        System.out.println(getName() + "以非常优雅的方法启动了,展示了一个苹果 logo!");
    }
}

FactoryPattern

/**
 * @author : gxd
 * @date : 2022/7/27 23:15
 */
public class FactoryPattern {
    /**
     * 定义一个方法,创建对象返回
     */
    public static Computer createComputer(String info){
        switch (info){
            case "huawei":
                Computer c = new Huawei();
                c.setName("huawei pro 16");
                c.setPrice(5999);
                return c;
            case "mac":
                Computer c2 = new Mac();
                c2.setName("MacBook pro");
                c2.setPrice(11999);
                return c2;
            default:
                return null;
        }
    }
}

FactoryTest

/**
 * @author : gxd
 * @date : 2022/7/27 23:13
 * 目标:设计模式:工厂模式
 * 
 * 什么是工厂设计模式?
 * - 之前我们创建类对象时,都是使用 new 对象的形式创建,在很多业务场景下也提供了不直接 new 的方式。
 * - 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。
 *
 * 工厂设计模式的作用:
 * - 工厂的方法可以封装对象的创建的细节,比如:为该对象进行加工和数据注入。
 * - 可以实现类与类之间的解耦操作(核心思想)。
 */
public class FactoryTest {
    public static void main(String[] args) {
        Computer c1 = FactoryPattern.createComputer("huawei");
        c1.start();
        Computer c2 = FactoryPattern.createComputer("mac");
        c2.start();
    }
}

总结

  1. 工厂设计模式的作用
  • 对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入。
  • 可以实现类与类之间的解耦操作(核心思想)

设计模式:装饰模式

什么是装饰设计模式?

  • 创建一个类,包装原始类,从而在新类汇总提升原来类的功能

装饰设计模式的作用:

  • 作用:装饰模式指的是在不改变原类的基础上,动态地扩展一个类的功能。
  1. 定义父类。
  2. 定义原始类,继承父类,定义功能。
  3. 定义装饰类,继承父类,包装原始类,增强功能!!

装饰模式 例子

InputStream

/**
 * @author : gxd
 * @date : 2022/7/27 23:35
 * 共同的父类
 */
public abstract class InputStream {
    public abstract int read();
    public abstract int read(byte[] buffer);
}

FileInputStream

/**
 * @author : gxd
 * @date : 2022/7/27 23:38
 * 原始类
 */
public class FileInputStream extends InputStream{
    @Override
    public int read() {
        System.out.println("低性能的方式读取了一个字节a");
        return 97;
    }

    @Override
    public int read(byte[] buffer) {
        buffer[0] = 97;
        buffer[1] = 98;
        buffer[2] = 99;
        System.out.println("低性能的方式读取了一个字节数组:" + Arrays.toString(buffer));
        return 3;
    }
}

BufferedInputStream

/**
 * @author : gxd
 * @date : 2022/7/27 23:41
 * 装饰类 继承InputStream 拓展原始类的功能
 */
public class BufferedInputStream extends InputStream{
    private InputStream is;
    public BufferedInputStream(InputStream is){
        this.is = is;
    }

    @Override
    public int read() {
        System.out.println("提供8KB的缓冲区,提高读取数据性能!");
        return is.read();
    }

    @Override
    public int read(byte[] buffer) {
        System.out.println("提供8KB的缓冲区,提高读取数据性能!");
        return is.read(buffer);
    }
}

DecoratorPattern

/**
 * @author : gxd
 * @date : 2022/7/27 23:37
 * 目标:设计模式:装饰模式
 *
 * 什么是装饰设计模式?
 * - 创建一个类,包装原始类,从而在新类汇总提升原来类的功能
 *
 * 装饰设计模式的作用:
 * - 作用:装饰模式指的是在不改变原类的基础上,动态地扩展一个类的功能。
 *    1. 定义父类。   InputStream(抽象父类)
 *    2. 定义原始类,继承父类,定义功能。    FileInputStream(实现子类,读取性能较差)
 *    3. 定义装饰类,继承父类,包装原始类,增强功能!!   BufferedInputStream(实现子类,装饰类,读取性能高)
 *
 */
public class DecoratorPattern {
    public static void main(String[] args) {
        InputStream is = new BufferedInputStream(new FileInputStream());
        System.out.println(is.read());
        System.out.println(is.read(new byte[3]));
    }
}

总结

  1. 装饰设计模式的作用?
  • 装饰模式指的是在不改变原类的基础上,动态地扩展一个类的功能