重学设计模式(四设计模式总结)
Posted 穆瑾轩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重学设计模式(四设计模式总结)相关的知识,希望对你有一定的参考价值。
1、设计模式总结
至此,我们已经完成了23种设计模式的学习,最后很有必要做个总结。
设计模式并不是一种具体的技术,它讲述的是解决问题的思想,是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解与应用。
在软件工程中有个概念,叫高内聚低耦合,它是作为评判一个软件设计的好坏标准之一。
高内聚:内聚针对的是模块的内部设计,是指一个软件模块内的各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密度高。简单的说就是一个模块是否由相关性很强的代码组成,没有冗余和过于复杂的逻辑,只负责一项任务,也就是常说的符合单一职责原则。
低耦合:耦合针对的是模块(或类)与模块(或类)之间交互的复杂度,模块间的耦合度取决于模块间接口的复杂性、调用方式以及传递信息,传递的信息越少往往耦合度就越低。
高内聚低耦合可以保证服务的独立性以及系统的灵活性。因此我们学习设计模式的核心思想与之不谋而合——解耦合(减少可能增加耦合度的设计)。
不管是前端、还是后端都在趋向于组件化,甚至是应用架构上也诞生了微服务,而组件化、微服务化的思想都是高内聚低耦合的体现。
我们学习设计模式的核心思想就是解耦合,并不是消除耦合,而是把耦合控制在一定范围,找到稳定点和变化点,运用抽象,把变化点隔离起来。先满足设计原则,再迭代出设计模式。
其实各设计模式之间都是有共通之处的(在java中是抽象、继承、多态、组合的综合运用),有些看起来十分类似但又能解决不同的问题,这些都是前人总结的经验,你也可以组合出更适用于你所编写的程序的一种模式。
声明:原创文章未经允许,不得转载!!!
1.1、设计原则总结
原则 | 定义 | 目的 | 应用 |
---|---|---|---|
单一职责原则-SRP | 一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分 | 功能解耦 | 比如:将用户信息分为属性类和行为接口,一个Dao代表一张表 |
开闭原则-OCP | 一个软件实体(如类、模块和函数等)应该对扩展开放,对修改关闭 | 降低维护带来的风险 | |
里氏替换原则-LSP | 继承必须确保超类所拥有的性质在子类中依然成立 | 防止继承泛滥 | 比如:父类中add()-方法被子类重写成subtraction()-减法功能,是没有必要使用继承关系的 |
接口隔离原则-ISP | 一个接口只干一件事,接口要瘦不要胖 | 功能解耦 | |
依赖倒置原则-DIP | 要面向接口编程,不要面向实现编程 | 功能模块解耦 | 比如:控制反转思想的应用(依赖注入),一般有构造注入、set注入或注解注入,因为是接口,可以传递不同的实现类,所以注入才有意义。 |
迪米特法则-LOD | 不该知道的不要知道,降低耦合度与复杂度 | 功能解耦 | 比如:外观模式、中介者模式就是它的应用 |
合成复用原则-CRP | 优先使用对象组合实现代码复用,其次才是继承 | 降低代码耦合 |
详细文章链接:重学设计模式(设计原则)_穆瑾轩的博客
1.2、设计模式总结
1.2.1、创建型设计模式
模式 | 定义 | 目的 | 应用 | 文章链接 |
---|---|---|---|---|
单例模式(Singleton Pattern) | 一个类只有一个实例,同时提供对该实例的全局访问点 | 保证全局唯一性,节约内存 | 主要应用系统的配置信息类、资源访问冲突情况;如:tomcat的ServletContext、Spring的默认注入、日志记录、线程池等等; | 重学设计模式(单例模式) |
原型模式(Prototype Pattern) | 通过拷贝原型创建新的对象 | 高效创建对象 | 创建一个复杂或非常耗资源的对象的时候使用克隆,避免重复创建的过程; Spring中bean的创建方式有两种单例模式和原型模式; | 重学设计模式(原型模式) |
工厂模式(Factory Pattern) | 不同条件下创建不同实例 | 封装复杂的创建逻辑 | 统一管理,将对象的实例化延迟,比如:BeanFactory; XML解析时的DocumentBuilderFactory; | 重学设计模式(工厂模式) |
建造者模式(Builder Pattern) | 将类的构建逻辑转移到类的实例化外部去实现 | 将复杂的构建与表示分离 | StringBuilder的append方法; SQL中的PreparedStatement; JDOM中的DomBuilder、SAXBuilder; | 重学设计模式(建造者模式) |
1.2.2、结构型设计模式
模式 | 定义 | 目的 | 应用 | 文章链接 |
---|---|---|---|---|
适配器模式(Adapter Pattern) | 允许具有不兼容接口的对象进行协作 | 兼容转换 | 比如:旧系统升级;java.io.InputStreamReader(InputStream java.io.OutputStreamReader(OutputStream) | 重学设计模式(-适配器模式) |
代理模式(Proxy Pattern) | 为其他对象提供一种代理以控制对这个对象的访问 | 增强职责 | JDK自动的动态代理:java.lang.reflect.Proxy struts2、mybatis中拦截器的实现; Spring中AOP的实现; | 重学设计模式(-代理模式) |
桥接模式(Bridge Pattern) | 将抽象部分与实现部分分离,使他们可以独立变化 | 将抽象和实现解耦 | JDBC驱动;日志分类; | 重学设计模式(桥接模式) |
组合模式(Composite Pattern) | 保证客户端用单个对象与组合对象的一致性 | 整体和部分的统一 | GUI中的容器;OA系统的组织架构; | 重学设计模式(组合模式) |
外观模式(Facade Pattern) | 为多个复杂的子系统提供统一的入口 | 简化客户端的调用 | Hibernate提供的工具类、Spring JDBC工具类; | 重学设计模式(外观模式) |
装饰器模式(Decorator Pattern) | 运行时增加/修改对象的功能,比生成子类更加灵活 | 增强职能 | java中IO流的设计; servlet中request对象的设计; | 重学设计模式(装饰器模式) |
享元模式(Flyweight Pattern) | 通过共享来缓存对象,降低内存消耗 | 优化资源配置 | 线程池、数据库连接池;String类的设计; | 重学设计模式(享元模式) |
1.2.3、行为型设计模式
模式 | 定义 | 目的 | 应用 | 文章链接 |
---|---|---|---|---|
模板模式(Template Pattern) | 一个方法里实现一个算法,并推迟定义算法中的某些步骤,从而让其他类重新定义他们 | 逻辑复用 | 为一些固定的流程类,提供扩展点; javax.servlet.http.HttpServlet中doGet/doPost调用 | 重学设计模式(模板方法模式) |
策略模式(Strategy Pattern) | 分离算法,选择实现 | 移交选择权 | GUI中的布局管理(比如:可以选择流式布局、网格布局等); Spring中Resource接口资源访问策略; | 重学设计模式(策略模式) |
命令模式(Command Pattern) | 将请求和与执行请求的职责分离,方便对请求进行储存、传递、调用的管理 | 解耦请求与处理 | 数据库的事务处理机制;命令的撤销与恢复; | 重学设计模式(命令模式) |
责任链模式(Chain of Responsibility Pattern) | 将特定行为转换为处理程序的独立对象 | 解耦请求的发送者与接受者 | java中异常处理机制(try-catch);Servlet中过滤器的链式处理;javascript中事件的冒泡和捕获机制; | 重学设计模式(责任链模式) |
状态模式(State Pattern) | 将表示对象状态的逻辑分散到代表状态的不同类中 | 绑定状态和行为 | 线程对象状态切换 javax.faces.lifecycle.LifeCycle#execute() | 重学设计模式(状态模式) |
观察者模式(Observer Pattern) | 主要解决多个对象间存在一对多的依赖关系,当一个对象状态改变给其他对象通知的问题 | 解耦观察者与被观察者 | JDK中提供的观察者 java.util.Observer/ java.util.Observable; java.util.EventListener; | 重学设计模式(观察者模式) |
中介者模式(Mediator Pattern) | 通过中介者统一管理(大量多对多关系)对象,将对象之间的交互封装在中介者的对象中 | 减少对象间的耦合 | MVC模式中的C-控制器,连接了M-V; java.util.Timer; java.lang.reflect.Method#invoke() | 重学设计模式(中介者模式) |
迭代器模式(Iterator Pattern) | 提供一种在不暴露其底层表示的情况下访问聚合对象的元素的方法 | 统一对集合的访问方式 | JDK内置的collection容器使用了迭代 | 重学设计模式(迭代器模式) |
访问者模式(Visitor Pattern) | 稳定数据结构,定义新的操作行为 | 解耦数据结构和数据操作 | 可以充当拦截器; java.nio.file.FileVisitor-SimpleFileVisitor; | 重学设计模式(访问者模式) |
备忘录模式(Memento Pattern) | 保存对象的状态,在需要时进行恢复 | 备份、恢复 | 事务的回滚操作;photoshop中的历史记录; | 重学设计模式(备忘录模式) |
解释器模式(Interpreter Pattern) | 给定一个语言,定义它的语法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子 | 实现特定语法解析 | 正则表达式、EL表达式、数学表达式;自定义的一些解析规则; | 重学设计模式(解释器模式) |
以上是关于重学设计模式(四设计模式总结)的主要内容,如果未能解决你的问题,请参考以下文章
《重学 Java 设计模式》PDF 出炉了 - 小傅哥,肝了50天写出18万字271页的实战编程资料
《重学Java高并发》disruptor在数据同步场景下的应用实战(技术方案设计实战)
《重学Java高并发》disruptor在数据同步场景下的应用实战(技术方案设计实战)