设计模式复习
About 5 mindesign patternpattern
一、指导思想
这几个指导思想主要的目标是让写的代码能更灵活的被其他服务调用、在扩展新功能的时候可以不用修改原来的代码、就算需要修改的时候也只需要修改极少的代码量、而且写的代码可以被重复使用。这样的代码才是好的代码。
名称 | 解释 | 描述 |
---|---|---|
MainTainability | 可维护性 | 修改代码的时候,改动的越小维护性就越高 |
Reusability | 可复用性 | 代码可以被重复使用 |
Extensibility | 可扩展性 | 添加新功能的时候不用修改原来的代码 |
Flexiblity | 灵活性 | 代码接口可以被灵活调用 |
二、六大原则
为了实现上面的指导思想,于是就出现了六个开发的原则。不是每个原则都需要遵守而是要视情况而定。在何时的地方用合适的原则。
记忆方法: 李(里)姐(接)弟(迪)易(依)开单
简称 | 名称 | 描述 |
---|---|---|
SRP | 单一职责原则 | 类不能太大,不是自己负责的就不要处理 |
OCP | 开闭原则 | 对扩展开放、对修改关闭。多抽象,多态是开闭原则的关键 |
LSP | 里氏替换 | 子类完全可以替换父类。所有使用父类的地方都必须能透明的替换子类 |
DIP | 依赖倒置 | 面向接口编程,依赖接口比依赖具体实现 |
ISP | 接口隔离原则 | 接口尽量不要合二为一。将接口分为粒度更细的接口 |
LoD | 迪米特法则 | 尽量不要和陌生人说话,减少其他类的耦合度 |
三、GOF设计模式
GoF通过实践总结了一些特定场景的设计模式。这些设计模式能很好的符合六大原则,灵活的运用这些设计模式能在开发代码的时候有不同的设计思路。这些设计模式一共有23种,一般把这些设计模式分为3类(创建型、结构型、行为型),创建型关注对象的创建过程,结构型关注对象的组成方式,行为型关注对象之间的通信
名称 | 关注点 | 例子 |
---|---|---|
创建型 | 对象的创建过程 | 建造者、单例、工厂、抽象工厂、原型 |
结构型 | 对象的组合过程 | 外观、装饰、适配器、桥接、组合、享元、代理 |
行为型 | 对象的通信 | 策略、模版方法、中介者、备忘录、观察者、命令、责任链、解释器、迭代器、状态、访问者 |
四、具体
4.1 创建型
名称 | 描述 | 场景 |
---|---|---|
单例 | 系统中只存在一份 | spring的bean默认单例 |
工厂 | 通过工厂生产不同的类,屏蔽创建过程 | spring的bean工厂 |
抽象工厂 | 利用抽象工厂类创建工厂,创建过程交给过工厂类完成 | 定义一系列的产品族 |
建造者 | 需求变化的时候对象也跟着变化,通过不同的算法构建复杂的对象 | 构建一个复杂对象 |
原型 | 复制新类时(浅clone和深clone问题) | java clone |
4.2 结构型
名称 | 描述 | 场景 |
---|---|---|
外观 | 将多个类放在一个方法里面调用 | 接口多、调用复杂、需要统一调用时 |
装饰 | 选择不同的类可以组合出不同的功能 | 动态的给类添加职责时 |
适配器 | 类之间的适配过程,就行3孔插座转2孔插座 | 两个类之间需要转换时 |
桥接 | 将抽象和实现解耦,是他们可以独立变化 | 系统多角度分类,每个角度都可能变化 |
组合 | 自己的属性就是自己,利用递归进行解析 | 树形结构数据展示 |
享元 | 为了减少实例化的次数,利用共享对象的方式 | 线程池的池化思想 |
代理 | 添加一个中间层用一个类代替另一个的功能 | 动/静代理,cjlib、jdk自动的动态代理 |
4.3 行为型
名称 | 描述 | 场景 |
---|---|---|
策略 | 一个类的行为在运行时根据不同的策略进行更改 | 扩展其他策略不需要修改之前的代码。comparator |
模版方法 | 将一些通用的方法放在一起 | 每次都需要执行很多相同代码时 |
中介者 | 用星形接口改善调用的复杂度 | 类与类之间耦合特别严重时。消息中间件 |
备忘录 | 记录状态用于回滚,把内部状态记录在外部 | 需要记录操作备忘时 |
观察者 | 需要观察一个对象发生改变时做相应处理时 | mq、目标类发生改变通知所有观察者 |
命令 | 通过数据驱动行为,不同的命令执行不同的操作 | 有命令的地方 |
责任链 | 多个对象处理同一个数据形成链条式结构 | 日志、filter |
解释器 | 用于解释一种语言 | 语法需要解释的场景 |
迭代器 | 一个顺序访问容器元素的方法,一种多态的应用 | Iterator |
状态 | 内部状态的改变,其行为也跟着改变 | 条件、分支语句的代替者 |
访问者 | 执行的逻辑跟着访问者的改变而改变 | 需要对类进行很多不相关的操作,需要避免操作污染这个类时 |
五、总结
设计模式是在特定场景的一些优秀的设计方式,灵活的使用这些设计模式,能在开发代码的时候有更多选择思路。很多的设计模式都是相通的,没必要在写代码的时候生硬的套用这些设计模式。可以在实际代码开发中使用多种方式实现自己的业务逻辑。