# designStudy **Repository Path**: Estranger/design-study ## Basic Information - **Project Name**: designStudy - **Description**: 设计模式学习demo - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-27 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # designStudy ## 介绍 设计模式学习demo ## 软件架构 软件架构说明 ## 模式说明 ### 代理模式 自定义了一个静态工厂factory,模拟IOC容器。从容器中获取DogService,调用方法时,判断是否需要对此方法增强(动态代理,将这部分相同的逻辑抽取为一个独立的Advice,并在原始对象的初始化过程中,动态组合原始对象并产生代理对象)。 启动流程: - 启动ProxyApplication - 访问localhost://8081/index/ ### 工厂模式 - 简单工厂,就是将创建的过程抽象出来,不再具体的子类中实现,通过抽象类统一修改 - 工厂方法模式:核心是定义上层的接口/抽象类(抽象工厂类),下层通过接口/抽象类进行继承(具体的工厂子类),再由工厂子类生产具体的产品 - 抽象工厂模式:和工厂方法模式类似,核心在于对产品进行分组,把一类行为抽象成一个工厂,而不是创建多个工厂 ### 原型模式 实现Cloneable标记接口,重写Object类的clone方法。调用clone方法获得原型对象 浅拷贝和深拷贝: 1. 浅拷贝 当对象的成员属性的类型是基本类型时,进行值传递;是引用类型时,则进行引用传递(即两个对象的成员变量指向同一个内存地址)。 clone方法就是浅拷贝。 2. 深拷贝 基本类型复制值;引用类型申请一个新的存储空间,复制成员变量所引用的对象。有两种实现方式 - 自己实现clone方法。 - 通过序列化的方式 ### 建造者模式 核心角色: - Builder:抽象建造者,定义建造的方法 - ConcreteBuilder:具体建造者,实现Builder - Product:由一系列组件组成的复杂对象,建造的对象 - Director:负责编排建造的过程 两种方式: - firstWay:实现四种角色 - secondWay:将director、product、concreteBuilder三个角色合成一个组件,将concreteBuilder定义成product的静态内部类 与抽象工厂的区别在于,建造者模式更注重于组件的编排顺序,且更多是用来创建复杂对象 ### 适配器模式 三种实现: - 类的适配器模式 共有三个核心角色: - 目标Target - 被适配类Adaptee - 适配器Adapter 适配器继承被适配类,同时实现目标接口,这样就可以在内部,对两个类的方法进行调用,从而做一些逻辑处理 - 对象的适配器模式 区别在于,适配器类不再继承被适配类,而是聚合适配类,降低耦合 - 接口的适配器模式(又名缺省适配器模式): - 顶层用接口定义 - 适配器定义成抽象类,实现接口,重写接口的方法(空实现) - 具体的类继承这个抽象类,这样就可以通过匿名内部类指定使用接口的哪个方法 java8之后接口可以有default实现了,就可以省略抽象类这一层。但是很多框架里提供的接口是没有默认实现的,这时候用缺省适配器模式, 就可以方便的重写我们想要的那个方法。 ### 桥接模式 桥接模式 > 主要用于将抽象和实现分离,使得两个类可以独立扩展和变化,通过组合联系在一起,可以解决类爆炸的问题。 核心角色: - abstract抽象层 - interface接口层 - ConcreteImplementor:具体实现 - RefinedAbstraction:修正抽象化角色(这个角色可有可无),对抽象类做更近一层的修正和扩展 - ConcreteAbstraction:具体的子类 核心代码是将抽象层和接口层作为两个独立的类,通过在抽象层中组合接口层,将它们联系在一起,达到桥接的效果。在本文的例子中,咖啡 容量作为了抽象层,口味作为了接口层。 桥接模式体现了:单一职责原则、开闭原则、组合复用原则、依赖倒置原则。很多时候桥接模式可以取代多层继承,极大的减少了子类的个数(m*n变成m+n), 实现难点在于如何正确识别出两个类变化的维度,谁作为抽象层去组合另一个类。 ### 装饰器模式 装饰器模式 > 在不改变类原有结构下,对现有的类做装饰(增减功能) 核心角色包括:装饰类、被装饰类、接口层。其中装饰类(和被装饰类)需要实现接口层,并且组合接口,从而拿到接口的引用,进而调用接口的方法。这样原先 调用被装饰类的方法就可以替换成调用装饰者的方法,并且在装饰者子类中进行装饰(方法的扩展)。装饰者模式给人一种套娃的感觉(递归),可以多个装饰者 反复对一个类进行不同的装饰。 ### 观察者模式 其实就是发布——订阅模式。 核心角色: - Subject:提供操作Observer - Observer: 观察者抽象层 - ConcreteObserver: 具体的观察者 ### 状态模式 状态模式 > 基于某些特定业务和场景下,根据源状态和发生的事件,来执行下一步的流程处理逻辑,并设置一个目标状态 核心角色: - state: 抽象状态层 - ConcreteState: 具体的状态 - Context: 持有State接口,负责切换当前的状态 与策略模式的区别: - 策略模式定义了一组可互相代替的算法,这一组算法对象完成的是同一个任务,只是使用的方式不同,并且在使用策略模式的时候,不需要改变Context类; 而状态模式,不同状态完成的任务完全不一样 - 状态模式封装的是一个对象的状态,而策略模式封装的是一个策略算法 - 状态模式的状态迁移是有顺序的;策略模式可以随意使用 ### 责任链模式 责任链模式 > 处理器首尾相连形成一个链表,请求顺着链表往下传,直到被某个处理器处理掉 核心角色: - AbstractHandler: 处理器抽象层 - ConcreteHandler: 具体的处理器 核心在于handler中聚合自己,即持有下一个handler的引用,通过setter或者构造函数赋值下一个handler ## 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request