zoukankan      html  css  js  c++  java
  • excel模板解析—桥接模式:分离解析模板和业务校验

    在做excel模板解析的时候,其实会有两个部分,第一,将模板读取出来,校验一些必录项等。 但除了这些,在数据真正被业务线使用的时候,还会有一些其他的校验,比如说:根据业务,年龄是不能超过多少岁的,包括一些属性,在数据库、业务中是以什么类型传输应用的。 而且,这两个部分,都会面临着变化,模板并非一成不变,业务校验,也不可能一成不变。 怎样设计,才可以适应这种变化呢?   


    科普:变化驱动——正交设计  PS:理解并不是很深刻,就不叨叨了

    为了应对这种随时可能面临的变化,引入了桥接模式,分离了一个模板的数据解析工作,和数据校验工作。 

    一、桥接模式

    桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

    ●Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。

    ●RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。

    ●Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。

    ●ConcreteImplementor(具体实现类):具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法。

    二、具体应用

    在实际应用时,将具体的一些校验以工具类的形式实现。 毕竟,这是has a和is a的区别!

    具体的代码结构:

    三、总结

    这段内容很简单,但怎样做到从一开始就想到并做到,这是一个需要思考和总结的内容! 当系统这样设计后,如果我要增加一个模板,那么只需要增加一个类实例就可以,不管是读取还是业务校验,都是新增一个类,互不影响。  而抽离出来的工具类,可以服务于这些所有的模板。 

    PS:在最开始的时候,我的顶层接口,是用抽象类做的,后来改为了接口。 这是为什么呢?


  • 相关阅读:
    Ubuntu18.04下使用pip3.8报错subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-ze
    解决报错:ModuleNotFoundError: No module named ‘_sqlite3‘
    shell命令中find的用法
    Ubuntu 中卸载软件
    git使用
    django celery 使用
    Django 学习中遇到的问题
    1
    Mac 下安装brew(文末方法亲测有效)
    经典类与新式类的继承顺序
  • 原文地址:https://www.cnblogs.com/hhx626/p/8320397.html
Copyright © 2011-2022 走看看