23种设计模式 暂时的个人理解,以后继续扩展


个人理解,以后继续扩展,

    一个接口  实现多个方法  聚合作用   方法之间的关系 调用时 方便
    使用时要考虑得失
    
单例模式:
    整个应用里 只能有一个实例  、
    构造方法私有化
    懒汉模式 用的时候再初始化  双重锁 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对象 进行操作

备忘录模式:
    备忘录模式就是 主角 +备忘录+备忘录管理 三个角色
    主角拥有 状态 以及 生成备忘录的方法 即 将主角自己的状态 转换成备忘录实体 也可以通过传入备忘录 修改自己的状态 恢复到创建该备忘录的时间点的状态
     管理 主角 以及 备忘录之间的关系  
解释器模式:
    解释一段 有规则的文字
    抽象表达式接口  终结符表达式实现类  非终结符表达式实现类  客户端或者环境类

 

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