23种设计模式总结及应用案例

设计模式,七大原则

开闭原则

对扩展开放(提供方),对修改关闭(使用方)。

抽象提供方的方法,调用方传入抽象类的子类实现,提供方调用子类方法完成具体实现

里氏替换原则

所有引用基类的地方都必须能透明的使用其子类,且行为不会发生变化。

依赖倒转原则

底层模块尽量不独立存在,应有其抽象类或接口,声明子类对象时由接口接收,作为实例与变量间的缓冲层,有利于程序扩展个优化。

中心思想是面向接口编程,相对于细节的多变性,抽象的东西稳定的多,以抽象为基础搭建的架构也更稳定。

单一职责原则

降低类的复杂度,一个类只负责一项职责。

接口隔离原则

将接口拆分成多个,类只需要实现自己用到的接口方法,避免不必要的方法实现。

合成复用原则

迪米特法则

二十三种设计模式

创建型

工厂方法
核心思想:简单工厂基础上,通过实例化不同的工厂,来创建不同的类。
factory method
抽象工厂
核心思想:工厂方法基础上,让一个工厂生产一类对象。
对工厂进行抽象,将类的创建过程延迟到工厂的子类中完成。这样做的好处是当需要新增加一个新的产品类的时候,只需要新增一个“具体的工厂”就可以,而不需要像简单工厂一样,修改工厂类的具体实现。符合“开闭原则”。
在工厂方法的基础上,在一个具体工厂中实现生产不同产品的方法。可以达到方便生产一个“产品簇”的目的。
为什的可以new对象还要用工厂?
  • 添加权限验证,日志记录,对象修饰
abstract factory
单例模式
核心思想:让一个类自身持有其实例的成员变量,声明为static和private,来达到系统中只有一个实例的目的,主要解决一个全局使用的类频繁的创建与销毁。
为了确保全系统只有一个实例,所以不可以让用户自己创建,所以这个类需要一个private的构造函数。还需要一个getInstance()方法用来获得这个唯一的实例,因为需要在系统的每一处都能获得,所以这个方法应该是public的。因为调用的getInstance()的目的是获取实例,只能在类上面调用,所以getInstance()应该是static的。
singleton
建造者模式
核心思想:定义一个建造过程,具体的建造放在子类当中,这样可以使用相同的建造过程构造不同的实例,用于复杂对象的创建。
添加静态内部类用于创建对象
  • lombok的@Builder注解
  • 用友框架的SqlParam
builder
原型模式
核心思想:使用Object类的clone方法,快速复制对象。
实现cloneable接口,重写clone方法(浅拷贝)
所有引用类型成员变量都要,实现cloneable接口,重写clone方法(深拷贝)
prototype

结构型

适配器模式
核心思想:创建一个适配器类可以同时具备有现有类的行为,和期望的接口。
类适配器:适配器类实现期望的接口,继承现有的类已获得他的行为(方法)。
对象适配器:适配器类实现期望的接口,并持有现有类的实例,通过实例调用方法。
bufferedreader
  • inputstreamreader就是适配器
    • fileinputstream
windowadapter抽象类,不是适配器模式,只是代开发者实现了目标接口,开发者继承他重写自己要用的就可以了
adapter
代理模式
核心思想:代理类持有具体实现类的实例,将在代理类上的操作转化为实例上方法的调用。
proxy
桥接模式
核心思想:使用组合或者聚合的方式处理抽象和实现之间的联系,让具体的实现在不同维度上变化
抽象礼物:聚合礼物实现
  • new冷酷的礼物(new 花)
  • new温暖的礼物(new 书)
礼物实现
bridge
组合模式
核心思想:让具体类和这些类的容器实现同一个接口,用户调用到容器类时使用递归调用,不需要区分这两者的区别。
用来处理树状结构,枝节点与叶子节点都继承自根节点,递归遍历
composite
装饰模式
核心思想:建一个对象池,复用需要在系统中多次出现的对象。
不论是具体的组件,和装饰过后的组件,都希望可以用相同过的方式使用,所以实现同一个接口。装饰类需要持有一个具体组件的实例,才能调用他的方法,所以需要一个聚合关联。
decorator
外观模式
核心思想:在外观类内实现具体的操作,用户只需要和外观类打交道,屏蔽方法调用细节。
网关,解呕
facade
享元模式
核心思想:共享元数据,建一个对象池,复用需要在系统中多次出现的对象。
是一种池化思想,如线程池,数据库连接池,字符串应用了该模式。a.intern()==a
flyweight

行为型

解释器模式
解释脚本语言
正则表达式解析语句
模版模式
钩子函数
责任链模式
存储博客,定义过滤器链,分别进行敏感词和特殊符号过滤
Javax.servlet.filter
Javax.servlet.filterchain
处理请求与响应使用了责任链模式-〉123-〉321。
观察者模式
定义一系列监听逻辑,触发后做出反应,类似于责任链,但观察者不可中断
事件源对象
事件本身
观察者
Spring的aop切面也是一种观察者模式,切点是事件源,发出事件,切面是观察者
  • JDK自带Observable类,
    • add
    • delete
    • notify
命令模式
命令➕组合
宏命令
命令➕责任链
多级回退
命令➕
事务回滚
中介模式
消息中间件
解呕
迭代器模式
每个容器实现自己独有的迭代器方法。
备忘录模式
记录快照(瞬时状态)
单机游戏存档游戏进度
存盘
所有被保存的引用类型需要实现序列化接口
访问者模式
在结构不变的情况下,动态改变对于内部元素的动作。
电脑硬件不变,来访者自带折扣策略
  • 用于编译器,对表达式进行语法检查
状态模式
根据状态决定行为
有限状态机
  • 汽车
    • 开门状态
      • 可以关门
    • 关门状态
      • 可以开门
      • 可以启动
    • 启动状态
      • 可以停止
    • 停止状态
      • 可以启动
      • 可以开门
策略模式
封装了做一件事情的时候不同的执行方式。(排序时,传入自定义的比较器)
工厂日历策略化

设计模式解决哪些问题

代码可读性

复用性

扩展性

可靠性

设计模式其实就是把简单的问题复杂化哪部分变化就把那部分封装起来。

你可能感兴趣的:(设计模式)