# design-pattern **Repository Path**: git_sailor/design-pattern ## Basic Information - **Project Name**: design-pattern - **Description**: 设计模式 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2018-08-27 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 概述 根据模式是用来完成什么工作来划分,可分为:创建型模式、结构型模式和行为型模式,共3种。 1.创建型模式:用于描述"如何创建对象",特点是"将对象的创建与使用分离"。包括:单例、原形、抽象工厂、工厂方法、建造者等5种模式 2.结构型模式:用于描述如何将类或对象按某种布局构建更大的结构。包括:代理、适配器、桥接、装饰、外观、享元、组合等7种结构型模式 3.行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。 包括:模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。 #### 补充:软件设计7原则 1.开闭原则:软件实体应当对扩展开发,对修改关闭。 【纬度:拓展】 2.里式替换原则:继承必须确保超类所拥有的性质在子类中任然成立。通俗讲:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类方法。 【纬度:父与子】 3.依赖倒置原则:抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:面向接口编程,不要面向实现编程。 【纬度:父与子】 4.单一职责原则:一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。通俗讲:以类为单元的实体,职责要单一。【纬度:个体】 5.接口隔离原则:客户端不应该被迫依赖它不使用的方法,尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。 【纬度:父与子】 6.迪米特法则:如果两个实体无须直接通信,那么就不应该发生直接的相互调用,可通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立。【纬度:个体之间】 7.合成复用原则:要求在软件复用是,尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。【纬度:个体之间】 其实,软件设计7原则的本质就是"原子化,不可再分",在任何纬度尽量保持单元功能模块最小化。无非是从7个纬度来阐述其应用场景。 ***** 创建型模式 #### 单列模式 指一个类只有一个实例,切该类能自行创建这个实力的一种模式。 * 单例只有一个实例对象 * 该单例对象必须由单例类自行创建 * 单例类对外提供一个访问该单例的全局访问点 应用实例: 1. 一个班级只有一个班主任 2. 容器管理器 优点: 1. 在内存里只有一个实例,减少内存的开销,尤其是频繁的创建和销毁实例 2. 避免对资源的多重占用 缺点: 没有接口、不能继承 #### 创造者模式 是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程。 应用实例: 1. 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐" 2. JAVA中的StringBuilder 优点: 1. 建造者独立,以扩展 2. 便于控制细节风险 缺点: 1. 要求产品有共同点,范围有限制 2. 内部变化复杂,会有很多的建造类 #### 原型模式 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。 应用实例 1. 细胞分裂 2. JAVA中的Object clone()方法 缺点: 1. 配备clone方法需要考虑到,对于全新的类不难。但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象或者引用含有循环结构的时候。 2. 必须实现cloneable接口 ***** 结构型模式 #### 代理模式 一个类代表另一个类的功能,以便向外界提供功能接口 应用实例: 1.火车票代售点 2.孙悟空变高翠兰 3.房产中介、红娘 4.spring aop(Aspect Oriented Programming) 优点: 1. 职责清晰 2. 扩展性高 3. 智能化 缺点: 1.增加了代理,等于说多了一个第三方,可能会造成请求处理的速度变慢 2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂 #### 适配器模式 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类能一起工作。 应用实例: 1. 电脑usb转接口 2. 插座接口 优点: 1. 客户端可以通过适配器透明调用目标接口 2. 复用现有的类,不需要修改原有代码而重用现有的适配者类 3. 将目标类和适配者类解耦,解决了目标类和适配类接口不一致的问题 缺点: 1. 对类适配器来说,更换适配器的实现过程比较复杂 #### 桥接模式 将抽象部分与实现部分分离,使它们都可以独立变化 应用实例: 1. 武打动作加特效 2. 一棵树可以长出不同颜色的叶子 优点: 1. 抽象和实现的分离 2. 优秀的扩展能力 3. 实现细节对客户透明 缺点: 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程 #### 装饰模式 向一个现有的对象添加新功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有类的一个包装。 应用实例: 1. 法式布蕾拿铁、香草拿铁、冲绳黑糖拿铁、陨石拿铁,都是拿铁的装饰模式 优点: 装饰类和被装饰类可以独立发展,不会相互耦合。装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 缺点: 多层装饰比较复杂 #### 外观模式 隐藏系统复杂度,并向客户端提供了一个客户端可以访问的系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。 应用实例: 1. 去医院看病,要挂号、门诊、划价、取药,流程比较复杂,如果有提供接待人员处理,就方便很多。 2. 万能遥控器,可开电视、空调、吊灯。 优点: 1. 减少系统相互依赖 2. 提高灵活性 3. 提高安全性 缺点: 不符合开闭原则,改东西很麻烦,继承重写都不合适 #### 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能。 应用实例: 1. 线程池 2. spring 容器 优点: 大大减少对象的创建,降低系统的内存,使效率提高。 缺点: 提高系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。 #### 组合模式 用于把一组相似的对象当做一个单一对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。 应用实例: 1. 部门与子部门 2. 员工和子员工 优点: 1. 高层模块的调用简单 2. 节点自由增加 缺点: 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖导致原则。