设计模式归纳

设计模式是什么?是一种通用术语,本质是为了减少沟通的成本,并不是一种规范,一定要这么写才是好的。并且设置模式告诉我们有这些代码的组织方式,通过这些组织方式可以让我们的代码扩展性会更好(当然易读性会降低)。

还有一点,设计模式本质是对于继承、组合等的多种组织代码的方式。

设计的原则

  • 开闭原则:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展
  • 单一职责原则:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
  • 里氏替换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
  • 依赖倒置原则:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象,其核心思想是:要面向接口编程,不要面向实现编程。
  • 接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
  • 迪米特原则:一个软件实体应当尽可能少地与其他实体发生相互作用。

设计模式

创建型模式

  • 工厂方法:在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。也就是每个实现方可以按照自己的需要创建对应的对象。需要业务在需要哪个对象时去调用对应的工厂方法。子类自己初始化即可。
  • 简单工厂:拥有一个包含大量条件语句的构建方法, 可根据方法的参数来选择对何种产品进行初始化并将其返回。
  • 抽象工厂:在简单工厂上抽象了一层,可以解决需要创建一组相关或者相互依赖对象,而不用指定其具体对象
  • 生成器:分步生成复杂对象
  • 原型:复制对象
  • 单例:只生成一个实例

结构型模式

  • 适配器:转换与适配。对象适配器,写一个适配器的方法或者类进行封装,进行适配逻辑;类适配器:继承多个类或实现多个接口来进行适配
  • 桥接:将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用(在两者之间构造一个桥梁,比如在电脑与打印机之间构造mac与Windows电脑)
  • 组合:可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们(组织架构树)
  • 装饰:通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。实现功能的组合
  • 外观:能为程序库、 框架或其他复杂类提供一个简单的接口。不关心内在实现,只想使用简单接口,可以让自己的代码独立于复杂子系统
  • 享元:摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象
  • 代理:能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。Java里有动态代理:基于接口,基于类

行为模式

  • 责任链:将请求沿着处理者链进行发送,各种框架中的中间件是这种模式
  • 命令:将请求转换为一个包含与请求相关的所有信息的独立对象
  • 迭代器:在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素
  • 中介者:限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。对象之间有相互影响的依赖逻辑,将这些逻辑都提炼出一个中介者,对象只需要和中介者交互,无需关心其他对象的依赖逻辑
  • 备忘录:在不暴露对象实现细节的情况下保存和恢复对象之前的状态。经典实现方式依赖于许多流行编程语言 (例如 C++、 C# 和 Java) 所支持的嵌套类。每次构建新对象等都保存之前的样子,用于撤回等操作。
  • 观察者:定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。发布订阅
  • 状态:能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。都与有限状态机紧密相关。重点是将每个状态转换变成一个对象,对象内部执行逻辑,将上层进行简化。
  • 策略:定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。和工厂的区别在于关注点不同,本方法关注点在于执行什么逻辑,而工厂关注点在于构造什么对象。和状态模式区别在于状态模式里多个状态间可以知晓对方存在,而策略无须如此,状态模式可以理解为策略模式的扩展。
  • 模版方法:在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。和策略区别在于层次不同。
  • 访问者:将算法与其所作用的对象隔离开来。主要做辅助功能。

疑问

如果我只关注策略里策略方法的对象生成,那么它是工厂模式?
如果我关注模版方法中的一个方法,那么对这个方法来说是否就是策略模式?