设计模式三大类别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luckystar_99/article/details/82776032

引言

在我们学习了一些编程语言,以及算法和数据结构之后,我们并没有掌握编程的全部。我们不能只满足于写出所谓的正确的代码,输入变量,得到结果,哪怕从事了几年的软件开发都还是处在编写简单逻辑代码+复制粘贴层次,这时候我们要学习设计模式。学习设计模式让我们的程序尽可能的可重用,尽可能的在需求变化时不修改或做最小的修改,尽可能的降低开发的逻辑复杂度,简言之,就是高内聚,低耦合。在学习设计模式之前,我们应该了解一下,设计模式分为那几大类型。

在这里插入图片描述


创建型模式

简介

  • 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。

作用

  • 创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。
  • 创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。

  1. 简单工厂
    当我们的程序在实例化对象的时候,如果输入的条件不一样,产生的对象也不一样,那么我们可以考录使用简单工厂对不同的实例进行统一封装。
  2. 工厂方法
    它是针对简单工厂的改进版,添加了对ProductManager的抽象
  3. 抽象工厂
    这个是最复杂的工厂模式,它用来生成一个产品线上所有产品,我们假设一个产品线上包括多个产品,不同的产品线上的产品个数是一样的,这样我们需要一个针对产品线的抽象,并且很显然不同产品线上的产品是不可能混到一起的。
  4. 单例模式
    这是比较好理解的一个模式,从字面上说,就是程序在运行过程中,希望在任意时刻,都只保留某个对象的唯一实例
  5. 建造者模式
    对于一些复杂对象来说,他可以分为多个不同的部分,在实例化时,不同部分时间实例化的顺序,有时会严格的限制,这时我们就可以使用建造者模式了。
  6. 原型模式
    我们在程序运行过程中,当需要新的实例对象时,有时并不希望是从头创建一个对象,而是希望新的实例的状态和某个存在的实例保持一致,这就是原型模式发挥作用的地方。

结构型模式:

简介

  • 结构型模式(Structural Pattern)描述如何将类或者对 象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。

分类:结构型模式可以分为类结构型模式和对象结构型模式:

  • 类结构型模式关心类的组合,由多个类可以组合成一个更大的
    系统,在类结构型模式中一般只存在继承关系和实现关系。
  • 对象结构型模式关心类与对象的组合,通过关联关系使得在一 个类中定义另一个类的实例对象,然后通过该对象调用其方法。 根据“合成复用原则”,在系统中尽量使用关联关系来替代继 承关系,因此大部分结构型模式都是对象结构型模式。

  1. 适配器模式
    当我们已经开发出一个模块,有一套清晰的接口,并且模块正在被某一个功能使用(意味着模块接口改变的可能性不高),这是如果有另外一个功能也需要使用这个模块的功能,但是对应的是一套完全不同的接口,这时适配器就可以发挥作用了。
  2. 装饰模式
    假如我们已经开发了一套功能,然后根据需求,需要增加一些子功能,而且这些子功能是比较分散的,必要时可以增删的,这时如果直接修改接口,可能会造成接口功能复杂并且不稳定,针对这种情况,我们可以使用装饰模式。
  3. 桥接模式
    面对对象提倡的几个最佳实践包括:1.封装变化;2.面向接口变成;3.组合优于继承;4.类的职责尽量单一。桥接器完美的体现了这些,通过创建型模式,我们可以很好的达到吗面向对象接口编程的目标,也就是说我们在程序中个变量的声明类型是接口类型或者抽象类,二具体的实现类型则由不同的设计模式使用不同方式制定。
  4. 享元模式
    当我们系统中需要使用大量的小对象,但我们又不希望将所有的小对象都创建出来时,可以考虑使用享元模式,它会抽取小对象中的公共部分,将其封装为基类,然后针对不同的条件创建小对象,同时在对象池中维护这些小对象,客户在需要使用小对象时,首先在对象池中查找,如果存在,直接返回。对于小对象中国“个性”部分,由调用小对象的客户端进行维护。
  5. 组合模式
    当我们的对象结构中存在“父子”关系时,可以考虑使用组合模式。
  6. 代理模式
    在编写程序时,有时我们希望使用某个对象或者模块的功能,但是因为种种原因,我们不能直接访问,这时我们可以考虑使用代理模式。
  7. 外观模式
    如果我们的程序需要深入调用某个模块的内部,但我们又不想和模块过于耦合,这时可以考虑使用装饰模式,来对外部封装内部子系统的实现。

行为型模式:

简介

  • 行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。

作用:

  • 行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。
  • 通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象 之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。

分类:行为型模式分为类行为型模式和对象行为型模式两种:

  • 类行为型模式:类的行为型模式使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。
  • 对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等方式来分配两个或多个类的职责。根据“合成复用原则”,系统中要尽量使用关联关系来取代继承关系,因此大部分行为型设计模式都属于对象行为型设计模式。

  1. 职责链模式
    如果完成一项业务,需要很多步相关操作,但是如果将这些操作完成封装到一个类或者方法里面,又违背了单一职责的原则,这是我们可以考虑使用职责链模式。
  2. 命令模式
    命令模式将发出命令和执行命令很好的区分开来,当我们执行某项业务时,客户端只需要构造一个请求,而不必关心业务实现的具体细节。即构造请求和业务实现是独立的。
  3. 解释器模式
    如果我们的系统中有些特定的问题反复的出现,我们想要对这些问题进行抽象,那应该如何做?试想一下,当我们写完代码后,是如何进行编译的?无论对C#,还是Java,它们的编辑器都会读取我们所写的每一行代码,并作出相应的解释。我们可以部分认为,编译器中存储了任何组合的语句看,类似于C中的typedef。解释器做的就是类似的事情。它将具有通用性的问题进行抽取,对齐解决方案进行综合处理
  4. 迭代器模式
    访问者模式针对的是存储在一起的不同类型的对象集合,如何进行遍历处理,那么针对存储在一起的相同类型的对象集合,我们应该如何进行遍历呢?迭代器模式可以帮我们做到。
  5. 中介者模式
    如果我们的系统中有多个对象,彼此之间都有联系,那就是一个对象之间耦合很高的系统,我们应该如何优化呢?我们可以建立一个所有对象的“对象”,在它内部维护其他对象之间的关联,这就是中介者模式。
  6. 备忘录模式
    当我们的系统中存在这样一个对象,它的属性很多,在某些情况下,它的一部分是需要进行备份和恢复的,那应该如何做?谈到备份和恢复,我们应该立刻想到使用原型模式,但那是针对所有属性的,备忘录模式可以很好的解决这个问题。
  7. 观察者模式
    当我们的系统中存在一个业务A,有其他多个业务都需要关注也去A,当他的状态发生变化是,其他业务都需要去做出相应的操作,这时我们可以使用观察者模式。
  8. 状态模式
    当我们系统中的对象,需要根据传入的不同参数,进行不同的处理,而且传入的参数的种类特别多,这时在方法内部会产生大量的if语句,来确定方法的执行分支。那么如何消除这些if语句呢?状态模式可以帮我们做到。
  9. 策略模式
    当我们的系统中,针对某项业务有多个算法时,如何对这些算法进行管理,我们可以考虑使用策略模式,它主要是针对一组可以提取相同接口的算法进行管理 。
  10. 模板方法模式
    继承是面向对象的一大核心,而模板方法就是对继承的完美体现。对于某项业务来说,我们可以根据通用的流程,设计其方法骨架,针对不清晰或者不明确的地方,以抽象方法来处理,然后根不同的子业务,创建不同的子类,在自类中,实现那些抽象方法。
  11. 访问者模式
    当我们有一个对象集合,集合中的元素类型不一样,但类型是相对固定的,例如只有3重不同的类型,但是可能有30中元素。如果我们希望对集合中的所有元素进行某种操作,从接口的角度看,由于类型不一致,我们很难通过一个统一的接口来遍历集合元素并对其进行操作。这是我们可以考虑访问者模式,它将获取某个元素和对元素进行操作进行了分离。

猜你喜欢

转载自blog.csdn.net/luckystar_99/article/details/82776032