# DesignPatternsDemo1 **Repository Path**: zhouluji/DesignPatternsDemo1 ## Basic Information - **Project Name**: DesignPatternsDemo1 - **Description**: 设计模式示例代码,自己学习所用 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-05-31 - **Last Updated**: 2022-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 设计模式 ### 设计模式的分类 ![img](pics/v2-9d2e282275913e6d24ca926a8a6c0b96_720w.jpg) ### 策略模式 1. 类图 ![image-20220530192110229](pics/image-20220530192110229.png) 2. 定义 定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。 3. 场景 - 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 - 一个系统需要动态地在几种算法中选择一种 - 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现 ### 观察者模式 1. 类图 ![image-20220530193021992](pics/image-20220530193021992.png) 2. 定义 定义对象间一种一对多的依赖关系,使得每 当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。 3. 场景 - 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。 - 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。 - 一个对象必须通知其他对象,而并不知道这些对象是谁。 - 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。 ### 装饰者模式 1. 类图 ![image-20220530193246178](pics/image-20220530193246178.png) 2. 定义 动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰模式相比生成子类更为灵活。 3. 场景 - 扩展一个类的功能 - 动态增加功能,动态撤销 ### 工厂方法模式 1. 类图 ![image-20220530193448073](pics/image-20220530193448073.png) 2. 定义 定义一个用于创建对象的 接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 3. 场景 - 日志记录器 - 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 - 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。 ### 单件模式 1. 类图 ![image-20220530193652869](pics/image-20220530193652869.png) 2. 定义 确保某一个类 只有一个实例,而且自行实例化并向整个系统提供这个实例。 3. 场景 - 产生唯一序列号 - WEB计数器 - I/O与数据库连接 ### 命令模式 1. 类图 ![image-20220530193914430](pics/image-20220530193914430.png) 2. 定义 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 3. 场景 认为是命令的地方都可以使用命令模式 ### 适配器模式 1. 类图 - 类适配器 ![image-20220530194055521](pics/image-20220530194055521.png) - 对象适配器 ![image-20220530194142783](pics/image-20220530194142783.png) 2. 定义 将一个类的接口变换成客户 端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 3. 场景 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式 ### 外观模式 1. 类图 ![image-20220530194254999](pics/image-20220530194254999.png) 2. 定义 要求一个子系统的外部与其内部的通信必须通 过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。 3. 场景 - 为复杂的模块或子系统提供外界访问的模块。 - 子系统相对独立 - 预防低水平人员带来的风险。 ### 模板方法模式 1. 类图 ![image-20220530194650800](pics/image-20220530194650800.png) 2. 定义 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改 变一个算法的结构即可重定义该算法的某些特定步骤。 3. 场景 - 有多个子类共有的方法,且逻辑相同。 - 重要的、复杂的方法,可以考虑作为模板方法。 ### 迭代器模式 1. 类图 ![image-20220530194906879](pics/image-20220530194906879.png) 2. 定义 它提供一种方法访问一个容器对象中各个元素,而又不需暴露该 对象的内部细节。 3. 场景 - 访问一个聚合对象的内容而无须暴露它的内部表示 - 需要为聚合对象提供多种遍历方式 - 为遍历不同的聚合结构提供一个统一的接口。 ### 组合模式 1. 类图 ![image-20220530195825422](pics/image-20220530195825422.png) 2. 定义 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构 3. 场景 部分、整体场景,如树形菜单,文件、文件夹的管理。 ### 状态模式 1. 类图 ![image-20220530195241447](pics/image-20220530195241447.png) 2. 定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其 类 3. 场景 - 行为随状态改变而改变的场景 - 条件、分支语句的代替者 ### 代理模式 1. 类图 - 静态代理 ![image-20220530195425086](pics/image-20220530195425086.png) - 动态代理(JDK代理) ![image-20220530195447910](pics/image-20220530195447910.png) 2. 定义 为其他对象提供 一种代理以控制对这个对象的访问 3. 场景 按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。