发表于: 2018-03-25 21:52:25
1 430
今天完成的事情:
阅读了《设计模式之禅》的 第一部分,主要是六大设计原则的介绍,总结如下;
- 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语言中的表现就是:
- 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
- 接口或抽象类不依赖于实现类;
- 实现类依赖接口或抽象类。
- Single Responsibility Principle: 单 一 职 责 原 则
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
带有id
和content
属性的新对象,并使用问候语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的代码和文档,《设计模式之禅》第二部分
遇到的问题:
收获:
设计模式的套路很多,理论指导实践,实践验证理论,对于在某些条件下的取舍能够做到心中有数
评论