写点什么

【源码分析设计模式 10】SpringMVC 中的建造者模式

  • 2022 年 4 月 15 日
  • 本文字数:2638 字

    阅读完需:约 9 分钟

(2)HighBuilding?

package designMode.advance.builder;


public class HighBuilding extends HouseBuilder {


@Override


public void buildBasic() {


System.out.println(" 高楼的打地基 100 米 ");


}


@Override


public void buildWalls() {


System.out.println(" 高楼的砌墙 20cm ");


}


@Override


public void roofed() {


System.out.println(" 高楼的透明屋顶 ");


}


}


4、指挥者 HouseDirector?




package designMode.advance.builder;


public class HouseDirector {


HouseBuilder houseBuilder = null;


//构造器传入 houseBuilder


public HouseDirector(HouseBuilder houseBuilder) {


this.houseBuilder = houseBuilder;


}


//通过 setter 传入 houseBuilder


public void setHouseBuilder(HouseBuilder houseBuilder) {


this.houseBuilder = houseBuilder;


}


//如何处理建造房子的流程,交给指挥者


public House constructHouse() {


houseBuilder.buildBasic();


houseBuilder.buildWalls();


houseBuilder.roofed();


return houseBuilder.buildHouse();


}


}


5、测试类




package designMode.advance.builder;


public class Client {


public static void main(String[] args 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 ) {


//盖普通房子


CommonHouse commonHouse = new CommonHouse();


//准备创建房子的指挥者


HouseDirector houseDirector = new HouseDirector(commonHouse);


//完成盖房子,返回产品(普通房子)


House house = houseDirector.constructHouse();


System.out.println("--------------------------");


//盖高楼


HighBuilding highBuilding = new HighBuilding();


//重置建造者


houseDirector.setHouseBuilder(highBuilding);


//完成盖房子,返回产品(高楼)


houseDirector.constructHouse();


}


}


6、控制台输出





六、建造者模式在 SpringMVC 中的实现


=====================


1、在 springMVC 中,我们就可以看到建造者模式的身影。




springMVC 在构建 UriComponents 的内容时,就用到了建造者模式,我们先来看看 UriComponents 这个类是提供了哪些 Components


public abstract class UriComponents implements Serializable {


private static final String DEFAULT_ENCODING = "UTF-8";


// 用于分割 uri 的正则表达式,下面会说到


private static final Pattern NAMES_PATTERN = Pattern.compile("\{([^/]+?)\}");


private final String scheme;


private final String fragment;


protected UriComponents(String scheme, String fragment) {


this.scheme = scheme;


this.fragment = fragment;


}


// 多个 Components 对应的 getter 方法


/**


  • 返回 URL 的 scheme.


*/


public final String getScheme() {


return this.scheme;


}


/**


  • 返回 URL 的 fragment.


*/


public final String getFragment() {


return this.fragment;


}


/**


  • 返回 URL 的 schemeSpecificPar


*/


public abstract String getSchemeSpecificPart();


/**


  • 返回 userInfo


*/


public abstract String getUserInfo();


/**


  • 返回 URL 的 host


*/


public abstract String getHost();


/**


  • 返回 URL 的 port


*/


public abstract int getPort();


/**


  • 返回 URL 的 path


*/


public abstract String getPath();


/**


  • 返回 URL 的 path 部分的集合


*/


public abstract List<String> getPathSegments();


/**


  • 返回 URL 的 query 部分


*/


public abstract String getQuery();


/**


  • 返回 URL 的 query 参数 map


*/


public abstract MultiValueMap<String, String> getQueryParams();


/**


  • 将 URL 的 components 用特定的编码规则编码并返回,默认为 utf-8


*/


public final UriComponents encode() {


try {


return encode(DEFAULT_ENCODING);


}


catch (UnsupportedEncodingException ex) {


Java 开源项目【ali1024.coding.net/public/P7/Java/git】 // should not occur


throw new IllegalStateException(ex);


}


}


/**


  • 编码的抽象方法,传入相应的编码规则


*/


public abstract UriComponents encode(String encoding) throws UnsupportedEncodingException;


/**


  • 将 URL 中的模板参数换成对应的值


*/


public final UriComponents expand(Map<String, ?> uriVariables) {


Assert.notNull(uriVariables, "'uriVariables' must not be null");


return expandInternal(new MapTemplateVariables(uriVariables));


}


/**


  • 将 URL 中的模板参数换成对应的值,输入为数组


*/


public final UriComponents expand(Object... uriVariableValues) {


Assert.notNull(uriVariableValues, "'uriVariableValues' must not be null");


return expandInternal(new VarArgsTemplateVariables(uriVariableValues));


}


/**


  • 将 URL 中的模板参数换成对应的值,输入为 UriTemplateVariables


*/


public final UriComponents expand(UriTemplateVariables uriVariables) {


Assert.notNull(uriVariables, "'uriVariables' must not be null");


return expandInternal(uriVariables);


}


/**


  • 将 URL 中的模板参数换成对应的值的最终的实现方法


*/


abstract UriComponents expandInternal(UriTemplateVariables uriVariables);


/**


  • 处理 URL


*/


public abstract UriComponents normalize();


/**


  • 返回 URL 的 string


*/


public abstract String toUriString();


/**


  • 返回 URI 格式的方法


*/


public abstract URI toUri();


@Override


public final String toString() {


return toUriString();


}


/**


  • 将这些 Components 的值赋给其 builder 类


*/


protected abstract void copyToUriComponentsBuilder(UriComponentsBuilder builder);


上面的代码不包括 UriComponents 类下其余的静态辅助方法,单单从此类的包含多种 components 中,就可以看出 UriComponents 的复杂程度。这些 components 大都对应了 url 的某个部分,能帮助 springMVC 对请求的 url 内容进行识别。springMVC 就是通过将 uri 构建成这个类,再对 uri 进行处理的。


2、UriComponentsBuilder




那么 springMVC 究竟是如何让请求的 uri 生成相应的 UriComponents 类呢?就要看看 UriComponentsBuilder 这个类了。


首先看看它的两个构造函数:

最后

看完上述知识点如果你深感 Java 基础不够扎实,或者刷题刷的不够、知识不全面


小编专门为你量身定制了一套<Java 一线大厂高岗面试题解析合集:JAVA 基础-中级-高级面试+SSM 框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>



针对知识面不够,也莫慌!还有一整套的<Java 核心进阶手册>,可以瞬间查漏补缺



全都是一丢一丢的收集整理纯手打出来的


更有纯手绘的各大知识体系大纲,可供梳理:Java 筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的 xmind 手绘图~




用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
【源码分析设计模式 10】SpringMVC中的建造者模式_Java_爱好编程进阶_InfoQ写作平台