# 设计模式练习 **Repository Path**: Gump_177/design-pattern-exercises ## Basic Information - **Project Name**: 设计模式练习 - **Description**: 记录练习与学习设计模式 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-26 - **Last Updated**: 2024-01-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: Cpp, 设计模式 ## README # 设计模式练习 ### 介绍 记录练习与学习设计模式 八大原则: #### 1、依赖倒置原则(DIP) 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。 #### 2、开放封闭原则(OCP) 对扩展开放,对更改封闭。 类模块应该是可扩展的,但是不可修改。 #### 3、单一职责原则(SRP) 一个类应该仅有一个引起它变化的原因。 变化的方向隐含着类的责任。 #### 4、Liskov 替换原则(LSP) 子类必须能够替换它们的基类(IS-A)。 继承表达类型抽象。 #### 5、接口隔离原则(ISP) 不应该强迫客户程序依赖它们不用的方法。 接口应该小而完备。 #### 6、优先使用对象组合,而不是类继承 类继承通常为“白箱复用”,对象组合通常为“黑箱复用” 。 继承在某种程度上破坏了封装性,子类父类耦合度高。 而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。 #### 7、封装变化点 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。 #### 8、针对接口编程,而不是针对实现编程 不将变量类型声明为某个特定的具体类,而是声明为某个接口。 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。 减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案。 ### 常用模式 #### 1、工厂方法: 使用抽象类型或者接口来避免直接使用构造函数new对象(在工程中使用太多的new扩展性很差) 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。让类的实例化延迟到子类。(依赖倒置原则) #### 2、抽象工厂: 抽象工厂提供一个创建一系列相关或者相互以来对象的接口,而无需指定他们具体的类。 与工厂方法的区别在于如果你需要增加一系列的产品,比如足球系列,那你只需要增加一族新的具体产品类并 提供一个对应的工厂类即可。 #### 3、建造者模式: 建造者模式:将客户端与包含多个部件所谓复杂对象的创建过程分离 客户端不必知道复杂对象的内部组成方式和装配方式 实际上,就是使用一个Director来指定建造者类型,通过setBuilder将类型传入。 #### 4、原型模式: 原型模式通过复制一个已有对象来获取更多相同或者相似的对象 #### 5、单例模式: 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一的实例。 3个要点: 1、这个类只能有一个实例(实例对象instance是static的) 2、它必须自己创建这个实例(构造函数是私有的) 3、它必须自己向整个系统提供这个实例 #### 6、适配器模式: 适配器模式是将一个类的接口转换成客户希望的另一个接口 让那些接口不兼容的类可以一起工作 有类适配器和对象适配器,但是通常使用对象适配器,因为更灵活 #### 7、策略模式: 策略模式是定义一系列算法,将每一个算法封装起来 并让他们可以相互替换,策略模式让算法可以独立于使用他的客户而变化 #### 8、组件模式 组合模式是组合多个对象形成树形结构以表示具有部分-整体关系的层次结构 组合模式让客户端可以统一对待单个对象和组合对象