jessenpan's blog

vuePress-theme-reco jessenpan    2016 - 2020
jessenpan's blog

Choose mode

  • dark
  • auto
  • light
主页
分类
  • 杂谈
  • 写作技巧
  • 职业发展
  • 计算机
  • DDD
标签
时光机
关于我
联系我
  • GitHub
author-avatar

jessenpan

6

文章

6

标签

主页
分类
  • 杂谈
  • 写作技巧
  • 职业发展
  • 计算机
  • DDD
标签
时光机
关于我
联系我
  • GitHub
  • 设计模式开篇

    • 为什么要写设计模式
      • 是什么与应用的差距
        • 如何深入的理解
          • 首先
          • 其次
          • 再者

      设计模式开篇

      vuePress-theme-reco jessenpan    2016 - 2020

      设计模式开篇


      jessenpan 2018-07-31 19:32:46 设计模式

      # 为什么要写设计模式

      设计模式,应该是一个比较老生常谈的话题了。在网络上或者书店里,随便一搜都是一大把的文章。

      虽然看过这么多的文章和书籍,在写代码的时候,总是会有一种,摸到键盘就忘记所有的困境。这是为什么呢?

      什么SOLID原则,23中设计模式的名称都信手拈来。就是一种,道理都懂,但就是过不好这一生的感觉。

      其实,这是认知层次的问题。我们只知道是什么,但是没有达到认知的下一层,如何应用。

      # 是什么与应用的差距

      拿设计模式中的Builder模式举例,它的定义:

      用于构建复杂的对象,用同样的构造过程来创建不同的表示

      上面这句话定义了构建Builder模式是什么

      看了上面的这个定义,不经会有疑问。

      1. 什么样的算是复杂对象?
        • 代码超过一千行?
        • 包含20个属性或者20个方法?
      2. 不同的表示是什么意思呢?
        • 是多态的子类
        • 调用同一个方法的表现行为不一样
      3. 还有创建过程怎么和行为进行分离?
        1. 用构造函数?是否会太冗余
        2. 内部类?
        3. 还是其它java或者C++等一些语言的语法糖实现?

      对于一些看过很多书籍和博客的程序员来说,更多看到的是一个简单的UML类图和一些文字描述,再辅助一些伪代码。对上面的一些问题,很难在看完之后有明确的答案。

      对于builder模式,就有这么多疑问。那么,对于其它22种模式,想必各位程序员会有更多疑问。

      作为有同样感触的我,希望做出一些改变。来解决自己的一些困惑&加深对这些模式的理解

      # 如何深入的理解

      # 首先

      还是需要俗套的定义一门语言,使用Java来辅助深入理解。

      1. 因为上面举例的builder模式所提出来问题的解答需要和语言相关,这些问题在不同语言下的回答可能不一样。
      2. 术业有专攻,作为一名Javaer,用java来回答可能准确性和专业性会更高。

      # 其次

      在GOF的设计模式或者其它万千书籍和博客的基础之上,提出自己以Java语言为基础的相关疑问和一些思考。主要有以下几点考虑:

      1. 以语言相关的疑问,能够帮助我们自己在使用中更好的代入感
      2. 在知名书籍的解答下代入自己的提问,以便能够更深入理解

      # 再者

      虽然大多的讲解里都会列出UML和相对应的代码。比如Builder模式:

      class ProductBuider{
          Product build();
          ProductBuider buildPart1();
          ProductBuider buildPart2();
      }
      class Product{
          private String part1;
      }
      
      1
      2
      3
      4
      5
      6
      7
      8

      这种模式代码层面的讲解和举例,虽然把模式的主要含义表示出来。但是,却很难给人充分和深刻的理解,有一种似懂非懂的感觉。

      什么样的代码举例,能够非常清晰和有深度的呢?

      那么,就非生产级别的代码莫属了。生产环境应用相关模式的代码,应该是更加贴近实际场景的。

      选取那些生产环境的代码呢?

      这里选取了github上非常热门的几个java开源库进行研究和分析,通过学习高水平的代码,来得出更加深入的应用。

      它们是:

      1. Java届必不可少-spring
      2. 谷ge出品-必属精品guava
      3. 比较优雅的json序列化工具-Gson
      4. Web服务器值得拥有-Tomcat
      5. 最后一位留给-Netty

      通过对这些开源、工业级的代码里设计模式的实际应用的分析,来达到更加深入和深刻理解。