# 设计模式 **Repository Path**: AryaFeng/design-patterns ## Basic Information - **Project Name**: 设计模式 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-07 - **Last Updated**: 2024-06-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1.面向对象的设计原则 ## 依赖倒置原则 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)。 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依于抽象。 ## 开放封闭原则 扩展开放,修改封闭 ## 单一职责原则 - 一个类应该仅有一个引起它变化的原因 - 变化的方向隐含着类的责任 ## Liskov替换原则 - 子类必须能够替换它们的基类(IS-A) - 继承表达类型抽象 ## 接口隔离原则 - 不应该强迫客户程序依赖它们不用的方法 - 接口应该小而完备 ## 优先使用对象组合,而不是类继承 - 类继承通常成为“白箱复用”,对象组合通常为“黑箱复用” - 继承在某种程度上破坏了封装性,子类父类耦合度高 - 对象组合则只要求被组合的对象具有良好定义的接口,耦合度第 ## 封装变化点 使用封装来创建对象之间的分界层,让设计者可以在封装的一侧进行修改,而不会对另一侧产生不良的影响 ## 针对接口编程 - 不将变量类型声明为某个特定的具体类,而是声明为接口 - 客户程序无需获知对象的具体类型,只需要直到对象所具有的接口 - 减少系统中各部分之间的依赖关系。 # 组件协作模式 典型模式:template method,strategy,observer/event。 ## Template Method 在软件构建过程中,对于某一项任务,它常常有稳定的整体结构,但是各个子步骤有很多改变的需求,由于固有的原因,无法和任务的整体结构同时实现。 如何在确定**操作稳定的前提下**,来灵活应对各个子步骤的变化或者晚期实现需求? 骨架稳定,将变化的东西放在子类。 适用条件:整个框架是稳定的。实现可以不稳定。 不要调用我,让我来调用你。反向控制接口。 **模板方法和策略方法的区别是:模板方法是基类定义好了一套流程,但是某些流程的步骤需要子类进行实现。而策略模式是定义一个算法。** ## strategy method ### 动机 在软件构建的过程中,有些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂。 如何在运行时根据需要透明的更改对象的算法,将算法和对象本身进行解耦? 如果含有很多的ifelse那就可能需要策略模式。 ![img.png](images/img.png) # Iterator 迭代器模式是对集合进行遍历的一种模式。他需要有一个基类 集合类。这个集合类的内部有一个获取该集合迭代器的方法。还应该有个抽象的迭代器类, 内部有两个方法,一个是hasNext,一个是next。 所有的集合应该继承集合基类。同时内部应该包含一个该集合的迭代器。而这个内部的迭代器 就是需要去继承迭代器的基类,实现那两个方法。 # Adapter