知行合一
Github
顺翔的技术驿站
顺翔的技术驿站
  • README
  • ABOUTME
  • Computer Science
    • 数据结构与算法
      • 位运算以及位图
      • 随机数
      • 递归
      • 经典排序算法
      • 经典查找算法
      • 数组和动态数组
      • 链表
      • 栈和队列
      • 树
      • 哈希表
    • 计算机网络
      • 物理层
      • 数据链路层
      • 网络层
        • TCP
      • 运输层
      • 应用层
      • HTTP
        • HTTPS的原理
        • DNS详解
        • file协议
        • 邮件协议
    • 设计模式
      • 单例模式
      • 建造者模式
      • 原型模式
      • 工厂模式
      • 享元模式
      • 代理模式
      • 装饰者模式
      • 桥接模式
      • 适配器模式
      • 外观模式
      • 组合模式
      • 事件驱动
      • 有限状态机
      • 备忘录模式
      • 模板方法模式
      • 策略模式
      • 迭代器模式
      • 命令模式
      • 解释器模式
    • 加密与解密
      • 数字证书原理
      • cfssl
  • Programming Language
    • 编程语言学习要素
    • Java
      • 集合
        • List
          • ArrayList
          • Vector
          • Stack
          • LinkedList
        • Iterator
        • Set
          • HashSet
          • TreeSet
        • Map
          • HashMap
          • HashTable
          • TreeMap
          • LinkedHashMap
      • 常用API
        • 日期时间处理
        • System
        • Random
        • Arrays
        • Scanner
        • 格式化输出
      • java特性
        • java5特性
        • java8特性
        • java9特性
        • java10特性
        • java11特性
      • 并发编程
        • 线程基础
        • 线程同步:synchronized及其原理
        • 线程同步: volatile
        • 锁机制
        • 锁的分类与对应的Java实现
        • JUC:同步辅助类
        • JUC: AtomicXXX
        • 线程池
        • ThreadLocal详解
      • 测试
        • 使用JMH进行基准测试
      • JVM
        • 强引用、软引用、弱引用、虚引用
        • jvm内存模型
        • jvm优化
        • GC算法与回收器
        • 静态绑定与动态绑定
      • ORM
        • Mybatis
          • IBatis常用操作
      • Web编程
        • Servlet详解(一)
        • Servlet详解(二):request和response对象
        • Servlet详解(三):会话技术与Cookie
        • JSP详解(一):页面构成、EL表达式
        • JSP详解(二):九大内置对象
        • JavaWeb的编码问题
        • Thymeleaf
      • Velocity
      • Java日志框架总结
      • Spring
        • SpringIOC
        • SpringMVC
        • SpringBoot源码
      • 其他
        • Apache Commons Lang使用总结
        • 使用FtpClient进行ftp操作
        • Java PDF操作总结
        • Java使用zip4j进行文件压缩
        • Java解析Excel总结
    • JVM Language
      • Groovy
      • Scala
    • Kotlin
      • 变量和常量
      • 数据类型
        • 基本数据类型
        • 容器类型
        • 函数类型
        • null和null安全
      • 流程控制
      • 包
      • 面向对象
    • Golang
      • 关键字与标识符
      • 变量和常量
      • 数据类型
      • 函数
      • 常用API
        • 时间日期处理
        • 字符串操作
        • 正则表达式
      • 控制语句
      • 包package
      • 面向对象
      • 错误处理
      • 命令行编程
        • Cobra
      • 文件操作
      • 测试
      • 并发编程
        • sync包详解
      • 数据格式与编码
        • 使用encoding包操作xml
        • 使用encoding包操作json
        • 使用magiconair操作properties
        • 使用go-ini操作ini
      • 反射
      • Build Tools
        • Go Module
        • Go Vendor
      • 日志框架
        • zap日志框架
      • Web编程
        • Gin
    • JavaScript
      • 数据类型
      • ECMAScript
        • ECMAScript6
      • NodeJS
    • TypeScript
      • 变量和常量
      • 数据类型
      • 函数
      • 面向对象
      • 泛型
      • Build Tools
        • tsc编译
        • 与webpack整合
    • Python
      • BuildTools
        • requirements.txt
        • Ananconda
    • Swift
      • 变量和常量
    • Script Language
      • Regex
      • BAT
      • Shell
    • Markup Language
      • Markdown
      • Yaml
  • Build Tools
    • CMake
    • Maven
      • 搭建Nexus私服
      • maven使用场景
    • Gradle
  • Version Control
    • Git
      • Git工作流
      • Git分支管理
      • Git Stash
      • Git Commit Message规范
      • .gitttributes文件
    • SVN
  • Distributed
    • 分布式基础理论
      • 互联网架构演变
      • 架构设计思想AKF拆分原则
      • CAP理论
      • BASE理论
    • 一致性
      • 一致性模型
      • 共识算法
        • Paxos
        • Raft
        • ZAB
      • 复制
        • 主从复制
        • Quorum机制
        • Nacos Distro协议
      • 缓存一致性
        • 双写一致性
        • 多级缓存一致性
    • 事务一致性
      • Seata
      • 本地消息表实现方案
      • 关于dpad的事务问题的分析
    • IO
    • RPC协议
    • 序列化
    • Session共享
    • 分布式协调
      • Zookeeper
        • zk集群4节点搭建
    • 服务治理
      • Dubbo分布式治理
    • 分布式ID
      • 分布式ID生成策略总结
    • 分布式锁
    • 应用服务器
      • Tomcat
    • Web服务器
      • Nginx
        • Nginx的基本配置
        • ab接口压力测试工具
        • nginx模块
        • 随机访问页面
        • 替换响应内容
        • 请求限制
        • 访问控制
        • 状态监测
        • nginx应用场景
        • 代理服务
        • 负载均衡
        • 缓存
        • 静态资源服务器和动静分离
        • 附录
      • Kong
    • 缓存中间件
      • Caffeine
      • memcached
      • Redis
        • Centos下安装Redis
        • RatHat下安装Redis
    • 数据库中间件
      • ShardingSphere
      • MyCat2
    • 消息中间件
      • Kafka
      • RocketMQ
  • Microservices
    • 服务发现
      • Nacos注册中心
      • Consul
    • 配置中心
      • Apollo
    • 消息总线
    • 客户端负载均衡
    • 熔断器
    • 服务网关
    • 链路追踪
      • Skywalking
  • Domain-Specific
    • Auth
      • 有关权限设计的思考
      • 认证方式
      • JWT
    • 任务调度
      • QuartzScheduler
      • Elastic-Job
      • XXL-Job
      • PowerJob
    • 工作流
      • BPM
      • Activiti
      • Flowable
    • 规则引擎
      • Drools
  • Architect
    • DDD领域驱动设计
      • 三层架构设计
      • 四层架构设计
    • Cola
    • 代码设计与代码重构
      • 重构改变既有代码设计
      • 枚举规范化
      • 接口幂等
      • 限流
      • 历史与版本
      • 逻辑删除和唯一索引
      • 业务对象设计
    • 单元测试
      • SpringBoot单元测试实践
    • 项目管理
    • APM
      • SkyWalking
      • Arthas
    • 性能优化
      • 接口性能优化
    • 系统设计
      • 流程中台
      • 短信中台
      • 权限中台
        • 智电运维平台组织架构改造二期
  • Database
    • Oracle
      • Docker下安装oracle11g
    • IBM DB2
    • Mysql
      • 安装Mysql
      • 用户与权限管理
      • MySQL的逻辑架构
      • 存储引擎
      • 索引详解
      • MySql的列类型
      • MySql中表和列的设计
      • MySql的SQL详解
      • 锁机制
      • 事务
      • Mysql函数总结
      • MySql存储过程详解
      • MySql触发器详解
      • Mysql视图详解
      • Mysql中Sql语句的执行顺序
      • 配置MySql主从和读写分离
      • MySql的备份策略
      • MySql分库分表解决方案
      • MySql优化总结
      • MySQL实战调优
        • schema与数据类型优化
    • Mongo
  • File System
    • README
    • HDFS
    • FastDFS
    • MinIO
  • Linux
    • 常用的Linux命令
    • vim
    • Linux磁盘管理
    • Linux系统编程
    • RedHat
      • rpm包管理器具体用法
    • Ubuntu
      • Ubuntu下录制屏幕并做成gif图片
      • Ubuntu20.05LiveServe版安装
  • DevOps
    • VM
      • 新建一个新的Linux虚拟机需要配置的东西
      • VMware桥接模式配置centos
      • VMwareFusion配置Nat静态IP
    • Ansible
    • Container
      • Docker
        • Dockerfile详解
        • DockerCompose详解
      • Containerd
    • Kubernetes
      • 安装k8s
        • 使用Minikube安装k8s
        • centos7.x下使用kubeadm安装k8s1.21
        • ubuntu20下使用kubeadm安装k8s1.21
        • centos7.x下使用二进制方式安装k8s1.20
        • 使用DockerDesktop安装K8s(适用M1芯片)
      • 切换容器引擎
      • 使用k8s部署项目的流程
      • 集群维护-备份升级排错
    • Gitlab
      • GitlabCI/CD
    • CI/CD
      • ArgoCD
  • Big-Data
    • Hadoop
    • MapReduce
    • HDFS
  • Front-End
    • Android
      • Log的使用、自定义Log工具类
      • Android倒计时功能实现
      • 解决ViewDrawableLeft左侧图片大小不可控的问题
      • AndroidSQLite基本用法
      • View的生命周期
      • 工具类
      • WebView详解
      • ViewTreeObserver类监听ViewTree
      • 在onCreate中获取控件的宽高等信息的几种方法
      • View的foreground属性
        • MaterialDesign
          • BottomNavigationBar
          • CardView
          • Elevation高度、shadows阴影、clipping裁剪、tint着色
          • TouchFeedbackRipple波纹动画
      • Volley完全解析——使用、源码
      • Android围住神经猫的实现
      • LookLook剖析,架构概述——MVP、Retrofit+RxJava
      • Android性能优化之渲染
    • Browser
      • 浏览器的工作原理
    • HTML
      • DOCTYPE标签、XHTML与HTML的区别
    • CSS
      • CSS的继承性、层叠性、权重
      • CSS浮动float详解(一):标准文档流
      • CSS浮动float详解(二):使用float
      • CSS浮动float详解(三):清除浮动方案
    • Tools Lib
      • JavaScript 文件下载解决方案-download.js
      • js-url 用于url的js开源库
      • jsuri 用于操作url的js开源库
      • window offset
    • React
      • 模块化和组件
      • 组件的三大核心属性
      • 事件处理
      • 表单数据收集
      • 生命周期
      • DOM的diff算法
      • 工程化
        • 脚手架create-react-app
        • 工程结构和模块化
      • 路由
  • Design
    • 产品设计
      • 交互设计
由 GitBook 提供支持
在本页
  • 设计模式六大原则
  • 开闭原则(核心原则)
  • 单一职责原则
  • 接口隔离原则
  • 里氏替换原则
  • 依赖倒置原则
  • 迪米特法则(最少知道原则)
  • 设计模式分类
  • 创建型模式
  • 结构型模式
  • 行为型模式

这有帮助吗?

在GitHub上编辑
  1. Computer Science

设计模式

设计模式六大原则

SOLID:

  1. Single Responsibitity Principle 单一职责原则

  2. Open Close Principle 开放封闭原则

  3. Liskov Substitution Principle 里氏替换原则

  4. Interface Segregation Principle 接口分离原则

  5. Dependence Inversion Principle 依赖倒置原则

  6. Least Knowledge Principle 迪米特法则

开闭原则(核心原则)

开闭原则规定软件中的对象、类、模块和函数对扩展应该时开放的,但是对于修改时封闭的。这意味着应该用抽象定义结构,用具体实现扩展细节,以此确保软件系统开发和维护过程的可靠性。开闭原则就是三个顶层的代码设计思维:

  1. 抽象意识

  2. 封装意识

  3. 扩展意识

关键字:实现只添加代码,不修改代码的设计,最典型的就是策略模式以及工厂模式

优点:

  1. 新老逻辑解耦,需求发生变化时不会影响老业务

  2. 改动成本最小,只需要增加逻辑

  3. 提供代码的稳定性与可扩展性

示例:

  1. 系统A与系统B之间数据传输时,约定协议时,要考虑协议的可以变性,抽取具有报文编译、编制、校验等所有版本协议使用的通用方法,面向接口开发。当出现新的协议时,可以在不更改代码的情况下增加新的协议实现。

单一职责原则

一个类或者模块只负责完成一个职责。一个类只负责完成一个职责或者功能,在也就是说,在设计类时,不要设计大而全的类,而是要设计力度小、功能单一的类。

关键词: 职责单一

例如:

  1. 实体对象/表 的设计中有与主体关联性弱的信息,这类需要根据实际的业务场景信息进行拆分,如果某些字段的信息有可能发生扩展,且扩展内容与主体有可能关联性弱,这类字段就应该单独提取出来。比如,UserInfo中的地址信息,如果地址信息后期有可能发生扩展、修改,那么该信息就应该单独提取出表。

  2. 接口的设计,接口是否只能有一个功能

如何判断一个类的职责是否单一:

  1. 类的代码行数、函数、属性过多

  2. 类以来的类过多

  3. 类的四方方法过多

  4. 类中的大量方法总是操作类中的几个属性

接口隔离原则

一个类对另一个类的依赖应该建立在最小的接口上。每一个接口应该承担独立的角色,不敢不该自己干的事,避免子类实现不需要的接口方法,需要对客户提供接口的时候,只需要暴露最小的接口。

关键字:接口职责单一

优势:

  1. 将庞大臃肿的接口分为多个细粒度的接口,可以提高系统的灵活性和可维护性

  2. 使用多个专门的接口,还能够体现出对象的层次

  3. 能够减少项目工程中的冗余代码

示例:

  1. 比如接口 Flyable和 Runnable两个接口,不可以合二为一

  2. 在JUC中,Executor 与 ExecutorService,Executor只提供一个execute方法,剩余的有子接口 ExecutorService进行功能扩展,就很好的遵守了接口隔离原则。备注: 如果是符合接口隔离原则的组合的Interface,在理解Interface时,将接口名单词拆分更好理解,以ExecutorService为例,可以拆分为Executor + Service,前者代表继承Executor接口,拥有执行的能力,后者则代表提供一系列服务的方法。

  3. Runnable、Future 以及他们的组合接口 RunnableFuture

里氏替换原则

简单来说,就是一个方法的参数假设是一个接口,那么这个方法可以处理所有这个接口的实现类,方法中不应该有特殊操作。并且是接口的哪儿种派生类的实现,都与接口或者积累方法的期望行为一致。

以下代码既符合开闭原则,也符合里氏替换原则:

// 类型转换,将任意类型转换为String
public static class Converter {
    String convert(String value);
}
// converter是可替换的,且无论什么方法都是返回一个string
public static String convert(Converter converter, Object target) {
    return converter.convert(target);
}

依赖倒置原则

依赖接口,不要依赖接口具体的实现。

迪米特法则(最少知道原则)

指一个类/模块对其他的类/模块有越少的了解越少。典型的迪米特法则的设计模式有适配器模式。通过中间人,降低类之间、模块之间的耦合性。

不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。

设计模式分类

创建型模式

    • Simple Factory,简单工厂,使用一个简单的标记获取这个标记对应的类实例。

    • Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。

    • Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。

结构型模式

共享池:

扩展对象的功能:

处理复杂对象关系:

行为型模式

    • Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。

    • PubSub,发布订阅模式

    • 状态迁移表示法。

    • State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。

行为抽象暴露:

模板行为抽象暴露:

  • Chain of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系

  • Mediator,中介者模式:用一个中介对象封装一些列的对象交互。

  • Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。

上一页邮件协议下一页单例模式

最后更新于10个月前

这有帮助吗?

Singleton,:保证一个类只有一个实例,并提供一个访问它的全局访问点。

Builder,:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。

Prototype,:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

Factory,

Flyweight,,共享单元放入享元池,以节省存储空间,是池技术的表现

Proxy,:为其他对象提供一种代理以控制对这个对象的访问

Decrator,:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。

Bridge,:将抽象部分与它的实现部分相分离(多维度分离),使他们可以独立的变化。

Adapter,:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。

Facade,:为子系统中的一组接口提供一致的界面,facade提供了一高层接口,这个接口使得子系统更容易使用。

Composite,:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。

Event Driven,

FSM,

Strategy,:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。

Command,:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。

Interpreter,:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

Template Method,:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。

Iterator,:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。

Memento,:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

单例模式
建造模式
原型模式
工厂模式
享元模式
代理模式
装饰模式
桥接模式
适配器模式
外观模式
组合模式
事件驱动
README
策略模式
命令模式
解释器模式
模板方法模式
迭代器模式
备忘录模式