发表于: 2018-03-25 21:52:25

1 431


今天完成的事情:

  • 阅读了《设计模式之禅》的 第一部分,主要是六大设计原则的介绍,总结如下;

    • Single Responsibility Principle: 单 一 职 责 原 则 
      • 用于划定类的职责,在合适的尺度上划分不同类所承担的责任,争取一个接口只完成某个方面的职责,不同的职责划分给不同的类完成
    • Open Closed Principle: 开 闭 原 则 
      • 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。这是为了应对不断变化的需求,为升级扩展打下基础。有抽象类约束,元数据控制模块行为(如spring的配置文件), 项目开发章程约束,对预计产生需求变更的部分进行封装(相同的变更封装在一个类或接口,不同的变更封装在不同的地方)
    • Liskov Substitution Principle: 里 氏 替 换 原 则 
      • 约束了父类与子类之间的关系,要求所有能使用父类的地方都必须能透明的使用其子类的对象。
      • 这要求: 
        • 子类完全实现父类的各个方法
        • 子类可以进一步增加自身特色
        • 覆盖或实现父类的方法时输入参数可被放大(如父类参数hashmap→子类参数map)
        • 覆写或实现父类的方法时输出结果可以被缩小(如父类方法返回值map→子类返回hashmap)
    • Law of Demeter: 迪 米 特 法 则 
      • 调包侠的真理:一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系。这是为了类之间的低耦合关系 
        • 只与直接的朋友类相关联。这里的朋友关系指组合,聚合,依赖等。
        • 通过访问控制标识(protected,private等)保持朋友类之间的距离
        • 如 果 一 个 方 法 放 在 本 类 中, 既 不 增 加 类 间 关 系, 也 对 本 类 不 产 生 负 面 影 响, 那 就 放 置 在本类中。
        • 谨 慎 使 用 Serializable 。在网络编程中一旦客户端或者服务端其中一者实现了访问权限变更,而另一端未能及时更新,就会报序列化失败
    • Interface Segregation Principle: 接 口 隔 离 原 则

      • 接口隔离原则与单一职责的审视角度是不相同的,单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分,而接口隔离原则要求接口的方法尽量少
      • 接口尽量细化,同时接口中的方法尽量少
      • 专门的接口指什么?就是指提供给每个模块的都应该是单一接口,提供给几个模块就应该有几个接口,而不是建立一个庞大的臃肿的接口,容纳所有的客户端访问。
    • Dependence Inversion Principle: 依 赖 倒 置 原 则

      • 高层模块不应该依赖低层模块,两者都应该依赖其抽象;
      • 抽象不应该依赖细节;.
      • 细节应该依赖抽象。
      • 依赖倒置原则在Java语言中的表现就是:

        • 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
        • 接口或抽象类不依赖于实现类;
        • 实现类依赖接口或抽象类。

RESTful API:

restful api是什么?

传统请求格式:http://.../queryItems?id=1

REST api: http://.../items/1

官方教程:https://spring.io/guides/gs/rest-service/

以Gradle构建为例:

在选定项目目录下建立目录结构:mkdir -p src/main/java/hello

在项目目录下建立一个build.gradle文件作为整个项目的配置文件:

接着创建资源表示类:

预期访问http://localhost:8080/greeting 返回json:

{ "id": 1, "content": "Hello, World!" 


接着创建资源管理类,映射到/greeting访问路径

@RequestParam将查询字符串参数的值绑定name方法name参数中greeting()此查询字符串参数明确标记为可选(默认情况下参数required=true):如果请求中不存在,defaultValue则使用“World”。

方法主体的实现基于下一个值创建并返回一个Greeting带有idcontent属性的新对象,使用问候语counter格式化给定name的对象template

传统的MVC控制器和上面的RESTful Web服务控制器之间的一个主要区别在于HTTP响应主体的创建方式。这个RESTful Web服务控制器并不依赖视图技术来执行将问候数据的服务器端呈现给HTML,而是简单地填充并返回一个Greeting对象。对象数据将作为JSON直接写入HTTP响应。

这段代码使用Spring 4的新@RestController注释,它将类标记为控制器,其中每个方法都返回一个域对象而不是视图。这是@Controller@ResponseBody 的汇总。

Greeting对象必须转换为JSON。由于Spring的HTTP消息转换器支持,您不需要手动执行此转换。因为Jackson 2在类路径上,Spring MappingJackson2HttpMessageConverter会自动选择将Greeting实例转换为JSON


运行:虽然可以将此服务作为传统WAR文件打包以部署到外部应用程序服务器,但下面演示的更简单的方法会创建独立应用程序。您将所有内容都打包在一个单独的,可执行的JAR文件中,并由一个Java main()方法驱动使用Spring的支持将在HTTP运行时嵌入Tomcat servlet容器,而不是部署到外部实例。

@SpringBootApplication 是一个方便的注释,它包含了以下所有内容:

  • @Configuration 将该类标记为应用程序上下文的bean定义的来源。

  • @EnableAutoConfiguration 告诉Spring Boot开始添加基于类路径设置,其他bean和各种属性设置的bean。

  • 通常你会添加@EnableWebMvc声明一个Spring MVC应用程序,但Spring Boot会在类路径中看到spring-webmvc时自动添加它这将该应用程序标记为Web应用程序并激活关键行为,例如设置一个DispatcherServlet

  • @ComponentScan告诉Spring在包中查找其他组件,配置和服务,以便找到控制器。

main()方法使用Spring Boot的SpringApplication.run()方法启动应用程序。你有没有注意到没有一行XML?没有web.xml文件。这个Web应用程序是100%纯Java,您不必处理配置。

通过将项目打包后,即可以如下代码启动REST api服务

java -jar build/libs/gs-rest-service-0.1.0.jar



明天计划的事情:

完善任务1的代码和文档,《设计模式之禅》第二部分

遇到的问题:

收获:

设计模式的套路很多,理论指导实践,实践验证理论,对于在某些条件下的取舍能够做到心中有数



返回列表 返回列表
评论

    分享到