个人理解,以后继续扩展,
一个接口 实现多个方法 聚合作用 方法之间的关系 调用时 方便
使用时要考虑得失
单例模式:
整个应用里 只能有一个实例 、
构造方法私有化
懒汉模式 用的时候再初始化 双重锁 volatile 方式 或者 静态内部类 因为 静态内部类 和外部类是两个class文件 只有用的时候才加载 静态内部类的class文件
饿汉模式 加载类的时候直接初始化 枚举方式
原型模式:
用一个已经创建的实例作为原型 通过实现cloneable接口 重写 clone方法 调用super.clone实现 该实例的浅拷贝
工厂方法:
一个工厂 (工厂类或者实现某工厂接口的类)生产一个产品(一个对象)
优点 将 创建 与 使用 分离 即使是用该对象的位置只有工厂类与方法 中间隔了一个工厂方法
缺点 增加产品要修改工厂类 甚至 增加工厂类和工厂方法
抽象工厂模式:
抽象工厂 定义 生产一组产品的接口 产品之间有一定的关系 将具有关系的产品集中在同一个工厂内生产 减少了工厂类的个数
A,B类实现抽象工厂C
A工厂生产A1,A2 A1,A2属于同一品牌
B工厂生产B1,B2 A1,B1 和A2,B2分别属于同类型产品
建造者模式:
一个对象过于复杂,有多个组成部分,多个属性,将组装属性的任务交给建造者执行
建造者执行对象各个部分的组装工作(方法),建造者最终返回一个对象
还需要指挥者 或者 客户端 来指挥建造者创建对象 接收对象引用
代理模式:
例如 火车站和火车票代售点 都出售火车票
1. 二者主要职责都是 售票 所以继承同一个接口 实现同样的方法
2. 火车票代售点 持有 火车站的引用 出售的是 火车站传递过来的票 可能收取手续费 是代售点的操作
3. 选择火车站 还是 代售点 依需求而定
疑问,有火车站和代售点 都是自己编写的、 为何要分离出代理 方便代售点周围人员购票
(程序观点:主业务逻辑 与 附加需求 分离 更容易控制程序结构)
远程代理:易于理解更直观,逻辑上实现更接近
虚拟代理:这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。
安全代理:
智能指引
延迟加载:
动态代理:实现invocationHandler 实现invoke方法 比原来多了 两步 ,1:实现invocationHandler 2.通过proxy生成代理对象
该方式看上去比静态代理多了一步
适配器模式:
类适配器模式 存在方法 a(B(接口类型)) 以及接口D 要实现不修改先存在代码的情况下 将D传入方法A class C extends D,B 就有 a(C)
对象适配器模式 存在方法 a(B(接口类型)) 以及接口D 不修改原先代码的情况下 实现C接口
class C implements B{
D d;
}
也就是说 重新实现一个B接口 让他持有D的时限对象的引用
桥接模式:
接口A持有接口B的引用,也就是 接口B是接口A的属性
装饰模式:
装饰模式 与代理模式 类似 只是不需要都 实现同一个接口 装饰类 持有 组件类的 引用 装饰类方法中调用
装饰接口 可以有多个实现 不同条件下 调用不同的实现
外观模式:
主接口 多个子接口 主接口 拥有多个子接口的引用(多个子接口属性)
享元模式:
接口或者类A 拥有两部分数据 1 可共享数据(所有同类对象所具有的状态) 2 不可共享数据(所有同类对象中每个对象独有的特征状态)
享元工厂里 可以有多个享元对象 一个接口 聚合属性 聚合多个对象 享元模式
组合模式:
透明模式:父接口 提供 操作方法 子接口 也就是实现类分两种 1.树叶节点 不实现父接口提供的操作方法 2 树枝节点 实现父接口的操作方法,拥有 集合 父接口类型
安全方式: 父接口 不提供操作方法 子接口 1.树叶节点 2.树枝节点 拥有 集合 父接口类型的数据 提供操作方法
组合模式 其实就是 树状结构 还可以扩展成 树叶节点和树枝节点 都有子类
模板设计模式:
父接口 抽象出 共用的部分 或者 统一的标准 子类实现 特有的部分
钩子方法 实现方式
策略模式:
父接口 两个不同方式的实现类 环境类 拥有父接口引用 以及set get 调用 或者 策略工厂 拥有一组父接口实现
命令模式:
三层引用格式
A接口 调用者 Invoker
B接口 命令 Command
C接口 接受者 Receiver 也就是命令执行者
A有属性B B有属性C A在方法中调用B的方法 B在方法中调用C的方法
命令者中有命令执行者也就是接受者的引用 命令者调用执行者的方法 执行操作
责任链模式:
一系列责任处理者组成链表 来执行调用者的的请求
请求处理者 持有下一级处理者的引用 本类处理不了 交由下级处理者处理 直到能处理 或者 所有处理者都执行结束依旧无法处理
所有的处理者 应该都是干一件事 处理某种请求 所以应该是同一个父类或者可以转成同一类型
客户端负责 将责任者组装起来 形成责任链 即责任链表
try catch 中 多个catch 就类似于 责任链模式 异常传递下去 直到找到合适的异常处理块
状态模式:
对象A 拥有状态接口B B有多种实现类 C状态 和 D状态 将A的状态设置为C状态 通过A的方法调用C状态的行为
状态切换 行为切换 执行C状态的行为 可能会改变A的状态 使A的状态转换为别的状态 例如D状态
类似于状态链 但是不持有下一个状态的引用 即下一个状态不是上一个状态的属性(上一个状态持有下一个状态的引用) 而是某状态执行某操作时 改变状态
执行某操作之后 或者 执行时 切换状态
执行完 之后 对象状态发生改变 (看问题角度改变 从面向对象 或者 真实世界角度出发)
对象持有自身的多个状态 调用某个特定状态 特定状态操作对象的下一个状态 实现状态改变
观察者模式:
又称 发布订阅模式 模型视图模式
主题也就是被观察者 拥有观察者集合 可以管理观察者 增加 删除 以及主题状态改变后 通知观察者之后
执行观察者自己继承自父接口的方法 即 被通知后要执行的操作
Observable Observer 被弃用
Flow是一类在Java中9中引入并具有4个相互关联的接口:Processor,Publisher,Subscriber和Subscription。
Flow.Processor :既充当订户又充当发布者的组件。
Flow.Publisher :订户收到的项目的生产者。
Flow.Subscriber :消息的接收者。
Flow.Subscription:链接a Flow.Publisher和的消息控件Flow.Subscriber。
中介者模式:
中介者拥有 用户集合 可以添加 删除 用户 以及通知用户方法 转发方法
用户 拥有中介者引用 (属性) 用户可以向中介者 发送 消息send方法(然后调用中介者的转发方法) 也可以接收中介者的消息receive方法
迭代器模式:
数据存储结构与遍历结构分离 数据存储结构只存数据 遍历放在迭代器中实现 可以实现多个不同的迭代器
数据存储结构 和 迭代器 同时持有 存储结构中的数据引用 一个做crud操作 一个做遍历操作 数据结构提供获取迭代器的方法
当需要为聚合对象体统多种便利方式,或者为便利不同的聚合结构提供统一的接口时,或者保护聚合对象的其他内部细节
访问者模式 :
A.accept(B){B.visit(A)} 主要结构
A提供是否 入口accept方法 引入接口B访问 B调用Visit方法 传入A对象 进行操作
备忘录模式:
备忘录模式就是 主角 +备忘录+备忘录管理 三个角色
主角拥有 状态 以及 生成备忘录的方法 即 将主角自己的状态 转换成备忘录实体 也可以通过传入备忘录 修改自己的状态 恢复到创建该备忘录的时间点的状态
管理 主角 以及 备忘录之间的关系
解释器模式:
解释一段 有规则的文字
抽象表达式接口 终结符表达式实现类 非终结符表达式实现类 客户端或者环境类