• Java 设计模式 Builder 模式 链式编程


    builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。示例如下:

    1. public static void main(String[] args) {
    2. MetaVo metaVo = new MetaVo();
    3. metaVo.setIcon("1")
    4. .setTitle("2")
    5. .setNoCache(true);
    6. System.out.println(metaVo);
    7. }

    这种设计模式的精髓就主要有两点:其一,用户使用简单,并且可以在不需要知道内部构建细节的情况下,就可以构建出复杂的对象模型;其二,对于设计者来说,这是一个解耦的过程,这种设计模式可以将构建的过程和具体的表示分离开来。

         Builder 模式创建步骤:

    • 在类中,创建一个静态内部类,包含外部类的全部属性;
    • 在内部类中,为每一个属性进行赋值;
    • 内部类中创建 build 方法,返回外部类对象
    • 在外部类中创建静态 builder方法,返回内部类对象

    拿实体类举例就是创建一个实体类,然后呢,将你的set方法稍作改动,示例如下(已注释说明):

    1. package com.pmtest.system.domain.vo;
    2. import com.pmtest.common.utils.StringUtils;
    3. /**
    4. * 路由显示信息
    5. *
    6. * @author ppq
    7. */
    8. public class MetaVo
    9. {
    10. /**
    11. * 设置该路由在侧边栏和面包屑中展示的名字
    12. */
    13. private String title;
    14. /**
    15. * 设置该路由的图标,对应路径src/assets/icons/svg
    16. */
    17. private String icon;
    18. /**
    19. * 设置为true,则不会被 缓存
    20. */
    21. private boolean noCache;
    22. /**
    23. * 内链地址(http(s)://开头)
    24. */
    25. private String link;
    26. public MetaVo()
    27. {
    28. }
    29. public MetaVo(String title, String icon)
    30. {
    31. this.title = title;
    32. this.icon = icon;
    33. }
    34. public MetaVo(String title, String icon, boolean noCache)
    35. {
    36. this.title = title;
    37. this.icon = icon;
    38. this.noCache = noCache;
    39. }
    40. public MetaVo(String title, String icon, String link)
    41. {
    42. this.title = title;
    43. this.icon = icon;
    44. this.link = link;
    45. }
    46. public MetaVo(String title, String icon, boolean noCache, String link)
    47. {
    48. this.title = title;
    49. this.icon = icon;
    50. this.noCache = noCache;
    51. if (StringUtils.ishttp(link))
    52. {
    53. this.link = link;
    54. }
    55. }
    56. public boolean isNoCache()
    57. {
    58. return noCache;
    59. }
    60. //默认生成类型是void,将其修改为你的实体类名称,注意不要使用你的属性的修饰类型
    61. public MetaVo setNoCache(boolean noCache)
    62. {
    63. this.noCache = noCache;
    64. //然后在加上这个return this;结束
    65. return this;
    66. }
    67. public String getTitle()
    68. {
    69. return title;
    70. }
    71. //默认生成类型是void,将其修改为你的实体类名称,注意不要使用你的属性的修饰类型
    72. public MetaVo setTitle(String title)
    73. {
    74. this.title = title;
    75. //然后在加上这个return this;结束
    76. return this;
    77. }
    78. public String getIcon()
    79. {
    80. return icon;
    81. }
    82. //默认生成类型是void,将其修改为你的实体类名称,注意不要使用你的属性的修饰类型
    83. public MetaVo setIcon(String icon)
    84. {
    85. this.icon = icon;
    86. //然后在加上这个return this;结束
    87. return this;
    88. }
    89. public String getLink()
    90. {
    91. return link;
    92. }
    93. //默认生成类型是void,将其修改为你的实体类名称,注意不要使用你的属性的修饰类型
    94. public MetaVo setLink(String link)
    95. {
    96. this.link = link;
    97. //然后在加上这个return this;结束
    98. return this;
    99. }
    100. @Override
    101. public String toString() {
    102. return "MetaVo{" +
    103. "title='" + title + '\'' +
    104. ", icon='" + icon + '\'' +
    105. ", noCache=" + noCache +
    106. ", link='" + link + '\'' +
    107. '}';
    108. }
    109. }

    将set方法的返回类型修改为实体类,在其方法内加入return this;实体类编辑完成,

    属性赋值的时候就可以进行链式编辑:

    1. public static void main(String[] args) {
    2. MetaVo metaVo = new MetaVo();
    3. metaVo.setIcon("1")
    4. .setTitle("2")
    5. .setNoCache(true);
    6. System.out.println(metaVo);
    7. }

    当然现在大多数的实体类都采用lombok的@Data注解,这样使代码更加简洁,示例如下:

    1. @Data
    2. //需要加上这个注解
    3. @Accessors(chain = true)
    4. public class Menu extends Model {
    5. }

    另外,常用的StringBuffer的append()方法,是不是觉的很相似,源码如下:

     偶然阅读一篇文章,忽然想起了这个,记录下所得;

  • 相关阅读:
    在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)
    Linux网络基础 局域网广域网 网络协议栈 网络传输流程 动图
    IOS使用WebView内嵌H5页面,使用a标签点击跳转无效问题解决
    【C++】迭代器:遍历容器的利器
    简单返回封装实体类(RespBean)
    设计一个填充工具完美解决前后端甩锅的问题了
    计算机毕业设计之java+ssm的图书借阅系统
    DGS之Mutations
    MySQL的增删查改(第一话)
    android 项目中导入flutter module
  • 原文地址:https://blog.csdn.net/qq_43393995/article/details/126441117