关于Python设计模式的一些事情,设计模式是否真能帮你解决什么问题?

目录

背景

设计模式定义,以及是什么

设计模式概述

设计模式有什么作用

应用场景

是否必须要设计模式

设计模式分类

1 创建型模式

2 结构型模式

3 行为型模式


注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料将在公众号CTO Plus发布,请关注公众号:CTO Plus

图片

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

设计模式是一种用于解决软件设计问题的经验总结(解决问题的一种方法),它提供了一套可重用的解决方案,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。设计模式是在软件开发过程中积累的一系列最佳实践和设计原则的体现。

Python一切皆对象,在Python中,所有的数据类型都是对象,包括整数、浮点数、字符串、列表、字典、集合等等。对象是Python中最基本的数据单位,每个对象都有自己的属性和方法。

具体来说,Python中的对象具有以下特点:
 

  • 对象具有类型:每个对象都有一个类型,可以使用type()函数获取对象的类型。

  • 对象具有属性:每个对象都可以有自己的属性,可以使用.操作符来访问

  • 对象的属性。对象可以作为参数传递:在

  • Python中,对象可以作为函数的参数传递给其他函数。

  • 对象可以作为返回值:在Python中,函数可以返回一个对象作为结果。

设计模式(Design Patterns)——可复用面向对象软件的基础。

关于Python面向对象的更对性质,将在公众号CTO Plus后面的文章详细介绍,尽情关注。

Python版设计模式系列文章清单

《Python设计模式之创建型-单例模式(Singleton)》

《Python设计模式之创建型-简单工厂模式(Simple Factory)》

《Python设计模式之创建型-工厂方法模式(Factory Method)》

《Python设计模式之创建型-抽象工厂模式(Abstract Factory)》

《Python设计模式之创建型-创建者(建造者)模式(Builder)》

《Python设计模式之创建型-原型模式(Prototype)》

《Python设计模式之创建型-对象池模式(Pool)》

《Python设计模式之创建型-惰性评价模式(Lazy Evaluation)》

《Python设计模式之结构型-代理模式(Proxy)》

《Python设计模式之结构型-适配器模式(Adapter)》

《Python设计模式之结构型-装饰器模式(Decorator)》

《Python设计模式之结构型-组合模式(Composite)》

《Python设计模式之结构型-外观模式(Facade)》

《Python设计模式之结构型-享元模式(Flyweight)》

《Python设计模式之结构型-桥接模式(Bridge)》

《Python设计模式之结构型-3层模式(3-tier)》

《Python设计模式之结构型-前端控制器模式(front controller)》

《Python设计模式之结构型-MVC模式(mvc)》

《Python设计模式之行为型-观察者模式(Observer)》

《Python设计模式之行为型-模板方法(Template Method)模式》

《Python设计模式之行为型-策略模式(Strategy)》

《Python设计模式之行为型-职责链模式(Chain of Responsibility)》

《Python设计模式之行为型-状态模式(State)》

《Python设计模式之行为型-迭代器模式(Iterator)》

《Python设计模式之行为型-访问者(访客)模式(Visitor)》

《Python设计模式之行为型-命令模式(Command)》

《Python设计模式之行为型-解释器模式(Interpreter)》

《Python设计模式之行为型-调停者(中介者)模式(Mediator)》

《Python设计模式之行为型-备忘录模式(Memento)》

《Python设计模式之行为型-目录模式(catalog)》

《Python设计模式之行为型-方法链模式(chaining method)》

《Python设计模式之行为型-发布订阅模式(publish subscribe)》

《Python设计模式之行为型-注册模式(registry)》

《Python设计模式之行为型-规格模式(specification)》

同样,设计模式跟编程语言无关,后期再记录总结下关于Go、C++的设计模式。

背景

在软件开发过程中,我们经常会遇到一些常见的问题,比如如何创建一个唯一的实例、如何将对象的创建与使用解耦、如何实现对象之间的松耦合等等。这些问题在不同的项目中都可能会出现,而设计模式提供了一种通用的解决方案,可以帮助我们更好地应对这些问题。

设计模式定义,以及是什么

设计模式(Design pattern)是一种在特定情境中,一套被反复使用、人人皆知的、经过分类归纳的、针对特定问题的解决方案,是代码设计经验的总结(解决问题的一种方法)。它是经过多次实践和验证的,可以被广泛使用的模板或蓝图,用于解决软件设计中的一些常见问题。

设计模式是一种通用的解决方案,它提供了一套经过验证的模式和原则,可以帮助我们更好地组织和管理代码。设计模式不是一种具体的技术或工具,而是一种思想和方法论,它可以指导我们如何设计和实现软件系统。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式概述

设计模式可以分为三个主要的分类:创建型模式结构型模式行为型模式。创建型模式关注对象的创建过程,结构型模式关注对象之间的组合和关联关系,行为型模式关注对象之间的交互和通信方式。

设计模式有什么作用

设计模式有以下几个作用:

1. 提供了一种通用的解决方案,可以解决软件设计中的一些常见问题。

2. 提高代码的可维护性、可扩展性和可重用性,使得代码更易于理解和修改。

3. 促进团队合作和沟通,提高开发效率和质量。

4. 降低系统的耦合度,使得系统更加灵活和可靠。

应用场景

设计模式可以应用于各种不同的场景,包括但不限于以下几种:

1. 当需要创建一个唯一的实例时,可以使用单例模式。

2. 当需要将对象的创建与使用解耦时,可以使用工厂模式。

3. 当需要实现对象之间的一对多依赖关系时,可以使用观察者模式。

4. 当需要根据不同的算法或策略来执行某个操作时,可以使用策略模式。

5. 当需要将不兼容的接口转换为客户端期望的接口时,可以使用适配器模式。

是否必须要设计模式

设计模式并不是必须要使用的,它只是一种解决问题的工具和方法。在某些情况下,使用设计模式可以更好地组织和管理代码,提高代码的可维护性和可重用性。但在其他情况下,设计模式可能并不适用或过于复杂,不值得使用。因此,是否使用设计模式需要根据具体的情况来决定。
 

设计模式的原则

设计模式的实现是基于一些设计原则和最佳实践的,通过遵循这些原则,可以使得软件系统更加健壮、灵活和可扩展。设计模式是这些原则的具体实现和应用。这些原则可以帮助我们更好地设计和实现软件系统。以下是一些常见的设计原则:

1、开放封闭原则(Open Close Principle)

开闭原则就是说软件实体应该对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。子类对象可以替换父类对象,而不影响程序的正确性。

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3、依赖倒置原则(Dependence Inversion Principle)

这个是开闭原则的基础,高层模块不应该依赖低层模块,它们都应该依赖于抽象。具体内容:是对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

客户端不应该依赖它不需要的接口,类之间的依赖关系应该建立在最小的接口上。

5、迪米特法则(最少知道原则)(Demeter Principle)

为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。一个对象应该对其他对象有尽可能少的了解,只与最直接的朋友通信。

6、合成复用原则(Composite Reuse Principle)

原则是尽量使用合成/聚合的方式,而不是使用继承。

7. 单一职责原则

一个类应该只有一个引起它变化的原因。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

设计模式分类

在前面概述的内容中介绍到设计模式又可归为:创建型、结构型和行为型3大类。

同时GoF该书中设计了23个设计模式,具体详情请看下图

图片

1 创建型模式

首先介绍下创建型模式,创建型模式是设计模式中的一种类型,用于创建对象的方式和实例化过程。它们提供了一种灵活的方法,可以在不暴露对象创建逻辑的情况下创建对象,并将对象的创建和使用进行分离开来。因为对象的创建会消耗掉系统很多的资源,所以单独对对象的创建阶段进行研究,从而能够高效地创建对象就是我们要对创建型模式进行探讨的问题。

创建型模式的存在是为了解决对象创建的灵活性和复杂性的问题。在软件开发中,对象的创建过程可能会涉及到复杂的逻辑和依赖关系,而这些细节可能会影响到代码的可读性和可维护性。创建型模式通过封装对象的创建过程,提供了一种清晰、可扩展和可维护的方式来创建对象。

下面是几种常见的创建型模式的介绍,分别如下:

1. 简单工厂模式(Simple Factory)

通过一个工厂类来封装对象的创建过程,根据不同的参数返回不同的具体对象实例。它隐藏了对象的创建细节,客户端只需要通过工厂类来创建对象,而不需要关心具体的实现细节。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之创建型-简单工厂模式(Simple Factory)》。

2. 工厂方法模式(Factory Method)

 

定义一个用于创建对象的接口,但是让子类决定实例化哪个类。工厂方法模式将对象的创建延迟到子类中,使得客户端代码与具体的类解耦,只依赖于抽象的接口。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之创建型-工厂方法模式(Factory Method)》。

3. 抽象工厂模式(Abstract Factory)

 

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通过封装一组相关的工厂方法,提供了一种创建一系列相关对象的方式。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之创建型-抽象工厂模式(Abstract Factory)》。

4. 建造者(创建者)模式(Builder)

 

将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式将对象的创建过程分解为多个步骤,并通过一个指导者来控制这些步骤的顺序和组合,从而创建出不同的对象。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之创建型-创建者(建造者)模式(Builder)》。

5. 原型模式(Prototype)

 

通过复制现有对象来创建新的对象,而不是通过实例化类来创建。原型模式通过克隆现有对象来创建新的对象,避免了对象创建过程中的复杂逻辑和依赖关系。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之创建型-原型模式(Prototype)》。

6. 单例模式(Singleton)

 

确保一个类只有一个实例,并提供一个全局访问点。单例模式通过限制一个类只能创建一个实例,提供了一种全局访问对象的方式。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之创建型-单例模式(Singleton)》。

7. 对象池模式(Pool)

 

维护一组可重用的对象,提供了一种对象的缓存和复用机制。对象池模式通过提前创建一组对象,并将其保存在一个池中,以供后续使用。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之创建型-对象池模式(Pool)》。

8. 惰性评价模式(Lazy Evaluation)

 

延迟计算或延迟加载,只在需要时才进行计算或加载。惰性评价模式通过延迟对象的创建或计算,提高了性能和资源的利用率。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之创建型-惰性评价模式(Lazy Evaluation)》。

这些创建型模式都有不同的应用场景和作用,可以根据具体的需求选择合适的模式来创建对象。它们提供了一种灵活、可扩展和可维护的方式来创建对象,同时也提高了代码的可读性和可维护性。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

2 结构型模式

接下来是介绍下结构型模式,在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低,这里有以下几个具体的结构型模式可供研究,它们分别是:

3层模式(3-tier)

3层模式是一种常见的软件架构模式,将一个软件系统划分为三个层次:表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。这种模式的作用是将系统的不同功能模块分离,使得系统更易于维护和扩展。在应用场景上,3层模式常用于开发Web应用程序,其中表示层负责用户界面的展示和交互,业务逻辑层负责处理业务逻辑,数据访问层负责与数据库进行交互。

适配器模式(Adapter)

适配器模式是一种结构型模式,它将一个类的接口转换成客户端所期望的另一个接口,从而使得原本不兼容的类能够一起工作。适配器模式的作用是解决两个已有接口之间的不兼容性问题。在应用场景上,适配器模式常用于系统升级或集成时,用于兼容旧的接口或第三方组件。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之结构型-适配器模式(Adapter)》。

代理模式(Proxy)

代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对真实对象的访问。代理对象和真实对象实现了相同的接口,客户端通过代理对象来访问真实对象。

例如,假设我们有一个图片加载器,用户可以通过加载器来加载图片。为了提高加载图片的性能,我们可以使用代理模式。代理对象可以在加载图片前先检查缓存中是否已经存在该图片,如果存在则直接返回缓存中的图片,如果不存在则调用真实对象来加载图片,并将加载的结果存入缓存中。

代理模式适用于需要控制对真实对象的访问、扩展真实对象的功能或者远程访问真实对象的情况。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之结构型-代理模式(Proxy)》。

装饰器模式(Decorator)

装饰模式是一种结构型模式,它允许在不改变原有对象的情况下,动态地给对象添加额外的职责。

装饰模式的主要作用是在不修改现有代码的情况下,通过装饰器类来扩展对象的功能。

在应用场景上,装饰模式常用于需要动态地给对象添加功能的情况,例如日志记录、性能监控等。例如,假设我们有一个文本编辑器,用户可以在编辑器中输入文本。我们希望给文本添加额外的功能,例如加粗、斜体和下划线等。如果直接在文本对象中添加这些功能,会使得文本对象的代码变得复杂且难以维护。

使用装饰器模式,我们可以创建一个装饰器类来包装文本对象,并在装饰器类中添加额外的功能。例如,可以创建一个加粗装饰器类、一个斜体装饰器类和一个下划线装饰器类,分别用于给文本添加加粗、斜体和下划线的功能。客户端可以选择性地组合这些装饰器类,从而实现不同的功能组合。

总之,装饰器模式适用于需要动态地给对象添加额外职责、扩展对象的功能或者动态地组合对象的功能的情况。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之结构型-装饰器模式(Decorator)》。

桥接模式(Bridge)

桥接模式是一种结构型设计模式,它将抽象部分和实现部分进行分离,使它们可以独立地变化。桥接模式通过创建一个桥接接口来连接抽象部分和实现部分,并在桥接接口中定义抽象部分和实现部分的方法。

桥接模式的作用是将抽象和实现解耦,从而使得它们可以独立地进行扩展。在应用场景上,桥接模式常用于需要多维度变化的情况。例如,不同操作系统下的图形界面、不同品牌的手机和软件。假设我们有一个画图程序,可以绘制不同类型的图形,例如圆形、矩形和三角形。我们希望在绘制图形的同时可以选择不同的颜色,例如红色、绿色和蓝色。如果直接在图形类中添加颜色属性,会使得图形类的代码变得复杂且难以维护。

使用桥接模式,我们可以创建一个颜色接口和一个图形接口,并在桥接接口中定义抽象部分和实现部分的方法。然后,我们可以创建不同的颜色实现类和图形实现类,并在客户端中动态地选择不同的颜色和图形进行组合。

总之,桥接模式适用于存在多个独立变化的维度、需要在运行时动态地选择抽象部分和实现部分或者需要在多个维度上进行扩展的情况。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之结构型-桥接模式(Bridge、多维度)》。

组合模式(Composite)

组合模式是一种结构型设计模式,它将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象。

组合模式的作用是使用户对单个对象和组合对象的使用具有一致性。在应用场景上,组合模式常用于处理树形结构的数据,例如文件系统、菜单、组织架构等。

例如,假设我们有一个文件系统,其中包含文件和文件夹。文件夹可以包含文件和其他文件夹。我们希望能够对文件系统进行统一的操作,例如遍历文件系统、计算文件系统的总大小等。

使用组合模式,我们可以创建一个抽象的文件系统对象,包含文件和文件夹。文件和文件夹都是文件系统对象的子类。文件夹可以包含其他文件系统对象,形成树形结构。客户端可以统一地处理文件和文件夹,而不需要为它们编写不同的代码。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之结构型-组合模式(Composite)》。

外观模式(facade)

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式将子系统的复杂性隐藏在一个简单的接口背后,客户端只需要通过外观对象来访问子系统,而不需要直接和子系统交互。

外观模式的主要作用是简化客户端和子系统之间的交互。而外观对象提供了一个统一的接口,隐藏了子系统的复杂性,使得客户端可以更方便地使用子系统。

例如,假设我们有一个文件读取器,用户可以通过读取器来读取不同类型的文件。读取器需要根据文件的类型选择不同的读取策略,例如文本文件使用文本读取策略,图片文件使用图片读取策略。如果直接让客户端和读取策略进行交互,会使得客户端的代码变得复杂且难以维护。

使用外观模式,我们可以创建一个文件读取器外观对象,将读取策略的复杂性隐藏在外观对象中。客户端只需要通过外观对象来读取文件,而不需要直接和读取策略交互。外观对象根据文件的类型选择合适的读取策略,并返回读取的结果给客户端。

总之,外观模式适用于需要简化客户端和子系统之间的交互、封装子系统的接口、解耦客户端和子系统之间的依赖关系的情况。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之结构型-外观模式(Facade)》。

享元模式(Flyweight)

享元模式是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。享元模式将对象分为可共享的内部状态和不可共享的外部状态,通过共享内部状态来减少对象的数量。

享元模式的主要作用是减少内存使用和提高性能。通过共享内部状态,可以减少对象的数量,从而减少内存使用。同时,共享对象可以减少对象的创建和销毁,提高性能。

例如,假设我们有一个文字编辑器,用户可以在编辑器中插入不同的图片。为了节省内存和提高性能,我们希望将相同的图片共享起来。如果直接创建每个图片的实例,会导致内存使用过多。

使用享元模式,我们可以创建一个图片工厂,负责创建和管理图片的实例。当用户需要插入图片时,我们先检查图片工厂中是否已经存在相同的图片实例,如果存在则返回共享的实例,如果不存在则创建新的实例并保存到图片工厂中。

总之,享元模式适用于需要创建大量相似对象、创建和销毁对象的代价很大或者对象的状态可以分为内部状态和外部状态的情况。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之结构型-享元模式(Flyweight)》。

前端控制器模式(front controller)

前端控制器模式(Front Controller)是一种设计模式,用于集中处理请求和控制应用程序的流程。它提供了一个单一的入口点,用于处理所有的请求,并协调其他组件来完成请求的处理和响应。

前端控制器模式的作用是提供一个统一的入口点,用于处理请求和控制应用程序的流程。它可以集中处理请求的验证、身份认证、日志记录等通用的处理逻辑,从而提高代码的复用性和可维护性。同时,它还可以协调其他组件来完成请求的处理和响应,使得系统更加灵活和可扩展。

MVC模式(mvc)

MVC模式(Model-View-Controller)是一种软件架构模式,用于将应用程序的逻辑、数据和用户界面进行分离。它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理数据逻辑,视图负责显示用户界面,控制器负责处理用户输入和控制应用程序的流程。

MVC模式的作用是将应用程序的逻辑、数据和用户界面分离,从而提高系统的灵活性和可维护性。通过将应用程序分为三个主要部分,MVC模式可以实现模块化的设计和开发,使得不同部分的代码可以独立地进行修改和扩展。

在实际的软件开发中,我们可以根据具体的需求和场景选择合适的设计模式,以提高代码的可读性、可维护性和性能。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

3 行为型模式

最后是到了对象的行为型模式,行为型模式是一种关注对象之间的通信和交互的设计模式。它们主要关注对象之间的相互作用,以及如何将责任和行为分配给不同的对象。

在对象的创建和对象的结构问题都解决了之后,就剩下对象的行为问题了,如果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提高,以下是具体的几个行为型模式可供研究,它们分别是:

观察者模式(Observer)

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。当主题对象发生变化时,它会自动通知所有的观察者对象(典型的发布订阅)。

观察者模式的作用是实现对象之间的松耦合,让主题对象和观察者对象之间的依赖关系变得动态和灵活。主题对象只需要维护一个观察者列表,而不需要关心具体的观察者对象。

观察者模式的应用场景包括:

1. 当一个对象的改变需要同时通知其他对象时,可以使用观察者模式。例如,当一个订单状态发生变化时,需要通知用户、库存管理系统和物流系统。

2. 当一个对象的状态变化需要触发其他对象的动作时,可以使用观察者模式。例如,当一个按钮被点击时,需要触发其他对象的相应动作。

3. 当一个对象需要将自己的状态变化通知给其他对象时,可以使用观察者模式。例如,当一个新闻发布者发布了一条新闻时,需要通知所有的订阅者。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-观察者模式(Observer)》。

状态模式(State)

状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。状态模式将对象的行为封装在不同的状态类中,对象在不同的状态下具有不同的行为。

状态模式的作用是将复杂的条件判断语句转换为一组状态类,让对象根据内部状态的改变自动切换行为。状态模式将状态的变化和行为的实现解耦,使得代码更加清晰和易于维护。

状态模式的应用场景包括:

1. 当一个对象的行为取决于它的状态,并且需要在运行时根据状态改变行为时,可以使用状态模式。例如,当一个订单的状态改变时,需要改变订单的处理方式。

2. 当一个对象有多个状态且状态之间存在转换时,可以使用状态模式。例如,当一个游戏角色有多种状态(正常、受伤、死亡)且状态之间可以相互转换时。

3. 当一个对象的行为包含大量的条件判断语句时,可以使用状态模式。状态模式将每个条件判断语句封装在不同的状态类中,使得代码更加清晰和易于理解。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-状态模式(State)》。

策略模式(Strategy)

策略模式是一种行为型设计模式,它定义了一组算法,并将每个算法封装在独立的策略类中。客户端可以根据需要选择不同的策略类来执行不同的算法。

策略模式的作用是将算法的实现和使用分离,使得算法可以独立于客户端的变化而变化。策略模式可以提高代码的灵活性和可维护性,同时也可以减少代码的重复。

策略模式的应用场景包括:

1. 当一个系统需要支持多种算法,并且需要在运行时动态地选择算法时,可以使用策略模式。例如,当一个排序算法有多种实现方式且需要在运行时选择时。

2. 当一个对象有多种行为且行为之间可以相互替换时,可以使用策略模式。例如,当一个支付方式可以有多种实现方式且需要在运行时选择时。

3. 当一个系统需要在不同的平台或者环境下使用不同的算法时,可以使用策略模式。例如,当一个图像处理软件需要在Windows和Mac两个平台上使用不同的渲染算法时。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-策略模式(Strategy)》。

责任链(职责链)模式(Chain of Responsibility)

责任链模式是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。责任链模式将接收者组织成链状结构,并将请求沿着链传递,直到有一个接收者处理请求为止。

责任链模式的作用是将请求的发送者和接收者解耦,使得请求可以沿着链传递,直到有一个接收者处理请求。责任链模式可以动态地改变链的结构和处理顺序,提高系统的灵活性和可扩展性。

责任链模式的应用场景包括:

1. 当一个请求需要多个对象来处理,并且每个对象处理请求的方式不同时,可以使用责任链模式。例如,当一个订单需要经过多个部门的审核时,每个部门的审核方式不同。

2. 当一个请求需要按照一定的顺序来处理时,可以使用责任链模式。例如,当一个请求需要按照一定的优先级来处理时。

3. 当一个请求的发送者和接收者需要解耦时,可以使用责任链模式。例如,当一个请求的发送者不需要知道请求的接收者是谁时。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-职责链模式(Chain of Responsibility)》。

命令模式(Command)

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使得可以用不同的请求来参数化其他对象。命令模式允许将请求的发送者和接收者解耦。

命令模式的作用是将请求的发送者和接收者解耦,使得请求可以被参数化和传递。命令模式可以将请求的发送者和接收者封装在不同的对象中,使得系统更加灵活和可扩展。

命令模式的应用场景包括:

1. 当一个请求的发送者和接收者需要解耦时,可以使用命令模式。例如,当一个请求的发送者不需要知道请求的接收者是谁时。

2. 当需要将请求的发送者和接收者封装在不同的对象中,并且需要支持撤销和重做操作时,可以使用命令模式。例如,当一个文本编辑器需要支持撤销和重做操作时。

3. 当需要支持命令的队列、请求的日志和事务等功能时,可以使用命令模式。例如,当一个电商平台需要记录用户的操作日志时。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-命令模式(Command)》。

访问者模式(Visitor)

访问者模式(Visitor)是一种行为型设计模式,用于将算法与数据结构分离,从而提高系统的灵活性和可扩展性。它定义了一个访问者类,用于对数据结构中的元素进行访问和操作。访问者模式可以在不修改数据结构的情况下,增加新的操作和算法。同时,它还可以将数据结构的遍历和操作逻辑分离,使得系统更加灵活和可维护。

访问者模式适用于以下场景:

1. 当一个数据结构中的元素需要进行不同的操作时,可以使用访问者模式。通过定义不同的访问者类,可以对数据结构中的元素进行不同的操作,而不需要修改数据结构本身。

2. 当一个数据结构的元素和操作的组合可能发生变化时,可以使用访问者模式。通过定义新的访问者类,可以增加新的操作和算法,而不需要修改数据结构本身。

3. 当一个数据结构的元素和操作的组合非常复杂时,可以使用访问者模式。通过将数据结构的遍历和操作逻辑分离,可以使得代码更加清晰和可维护。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-访问者(访客)模式(Visitor)》。

调停者(中介者)模式(Mediator)

调停者模式是一种行为型设计模式,它的作用是通过将对象之间的交互行为封装到一个调停者对象中,从而使得对象之间不需要直接相互通信。调停者模式可以降低对象之间的耦合度,提高系统的灵活性和可维护性。

调停者模式的应用场景包括:

1. 当一个系统的对象之间有复杂的交互关系时,可以使用调停者模式。例如,当一个GUI界面中的多个组件之间需要相互通信时。

2. 当一个系统的对象之间的交互行为需要被复用或者扩展时,可以使用调停者模式。例如,当一个系统中的多个子系统需要共享某些信息时。

3. 当一个系统的对象之间的交互行为需要被集中管理时,可以使用调停者模式。例如,当一个系统中的多个对象需要相互协调工作时。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-调停者(中介者)模式(Mediator)》。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

备忘录模式(Memento)

备忘录模式是一种行为型设计模式,它的作用是可以在不破坏对象封装的前提下,捕获对象的内部状态,并在需要时恢复对象的状态。备忘录模式可以提供对象的快照功能,使得对象可以在不同的状态之间切换。

备忘录模式的应用场景包括:

1. 当一个对象需要保存和恢复其内部状态时,可以使用备忘录模式。例如,当一个文本编辑器需要保存和恢复用户的编辑历史时。

2. 当一个对象的状态变化需要被记录和回滚时,可以使用备忘录模式。例如,当一个游戏需要保存和恢复玩家的游戏进度时。

3. 当一个对象的状态变化需要被观察和通知其他对象时,可以使用备忘录模式。例如,当一个系统中的多个对象需要观察和通知某个对象的状态变化时。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-备忘录模式(Memento)》。

迭代器模式(Iterator)

迭代器模式是一种行为型设计模式,它的作用是提供一种统一的方式来访问一个容器对象中的各个元素,而不需要暴露容器的内部结构。迭代器模式可以使得容器对象和遍历算法分离,从而提高系统的灵活性和可维护性。

迭代器模式的应用场景包括:

1. 当一个容器对象需要提供一种统一的方式来访问其元素时,可以使用迭代器模式。例如,当一个集合类需要提供一种统一的遍历方式时。

2. 当一个容器对象的内部结构发生变化时,不希望影响到其遍历算法时,可以使用迭代器模式。例如,当一个集合类的内部结构由数组变为链表时。

3. 当一个容器对象需要支持多种遍历方式时,可以使用迭代器模式。例如,当一个集合类需要支持正向遍历和反向遍历时。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-迭代器模式(Iterator)》。

解释器模式(Interpreter)

解释器模式是一种行为型设计模式,它定义了一种语言的文法,并且通过解释器来解释语言中的表达式。解释器模式可以将一个复杂的问题分解成简单的表达式,从而提高系统的灵活性和可扩展性。

解释器模式的应用场景包括:

1. 当一个问题可以被一种语言的文法描述时,可以使用解释器模式。例如,当一个计算器需要支持复杂的数学表达式时。

2. 当一个问题可以被分解成简单的表达式,并且可以通过组合这些表达式来解决时,可以使用解释器模式。例如,当一个文本解析器需要解析复杂的文本格式时。

3. 当一个问题的解决方案需要根据不同的语言文法来定制时,可以使用解释器模式。例如,当一个翻译器需要根据不同的语言来翻译文本时。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-解释器模式(Interpreter)》。

模板方法(Template Method)

模板方法是一种行为型设计模式,它定义了一个算法的骨架,并且将一些步骤的具体实现延迟到子类中。模板方法可以提供一个统一的算法框架,从而提高系统的灵活性和可维护性。

模板方法的应用场景包括:

1. 当一个算法的骨架已经确定,但是某些步骤的具体实现可能会变化时,可以使用模板方法。例如,当一个排序算法的比较规则可以根据不同的需求变化时。

2. 当一个算法的不同步骤需要不同的实现时,可以使用模板方法。例如,当一个文本处理器需要支持不同的文件格式时。

3. 当一个算法的不同步骤需要协同工作时,可以使用模板方法。例如,当一个游戏的关卡设计需要协同设计师、程序员和美术设计师共同完成时。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-模板方法(Template Method)模式》。

目录模式(Catalog)

目录模式(Catalog)是一种软件设计模式,用于管理和组织大量的对象。它通过将对象按照一定的规则进行分类和组织,提供了一种快速查找和访问对象的方式,目录模式可以提高系统的性能和可维护性。

目录模式适用于以下场景:

1. 当系统中存在大量的对象,并且需要根据一定的规则进行分类和组织时,可以使用目录模式。例如,一个电商网站中的商品可以按照类别、品牌、价格等进行分类和组织。

2. 当系统需要提供一种快速查找和访问对象的方式时,可以使用目录模式。通过使用目录模式,可以避免遍历整个对象集合来查找和访问对象。

3. 当系统需要支持动态增加和删除对象时,可以使用目录模式。通过使用目录模式,可以实现对象的动态管理和组织。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-目录模式(catalog)》。

方法链模式(Chaining Method)

方法链模式(Chaining Method)是一种编程技巧,用于实现连续调用多个方法。它通过在每个方法中返回对象本身,从而实现方法的链式调用。

方法链模式的作用是简化代码的编写和阅读。通过使用方法链模式,可以将多个方法的调用连在一起,从而减少代码的重复和提高代码的可读性。

方法链模式适用于以下场景:

1. 当一个对象需要连续调用多个方法时,可以使用方法链模式。例如,一个数据库查询对象可以通过方法链来设置查询条件、排序方式和分页参数。

2. 当一个对象需要提供一种简洁的接口来操作和修改其内部状态时,可以使用方法链模式。通过使用方法链模式,可以将多个操作和修改状态的方法连在一起,从而提供一种简洁的接口。

3. 当需要对一个对象进行多个操作时,并且希望代码的编写和阅读更加清晰和简洁时,可以使用方法链模式。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-方法链模式(chaining method)》。

发布订阅模式(Publish-Subscribe)

发布订阅模式(Publish-Subscribe)是一种消息传递模式,用于实现松耦合的消息通信。它将消息的发送者(发布者)和接收者(订阅者)解耦,通过一个中介(消息队列)来传递消息,发布订阅模式可以提高系统的灵活性和可扩展性。

发布订阅模式适用于以下场景:

1. 当系统中存在多个模块或组件,需要进行消息传递时,可以使用发布订阅模式。通过使用发布订阅模式,可以实现模块或组件之间的解耦,从而提高系统的灵活性和可扩展性。

2. 当系统需要支持动态增加和删除消息的接收者时,可以使用发布订阅模式。通过使用发布订阅模式,可以实现动态的消息订阅和取消订阅。

3. 当系统需要支持一对多的消息传递时,可以使用发布订阅模式。通过使用发布订阅模式,可以将消息发送给多个接收者,从而实现一对多的消息传递。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-发布订阅模式(publish subscribe)》。

注册模式(Registry)

注册模式(Registry)是一种软件设计模式,用于管理和访问全局对象。它通过将全局对象注册到一个中央注册表中,提供了一种统一的访问方式,注册模式可以简化代码的编写和提高系统的可维护性。

注册模式适用于以下场景:

1. 当系统中存在多个全局对象,并且需要统一管理和访问时,可以使用注册模式。通过使用注册模式,可以将全局对象注册到一个中央注册表中,从而提供一种统一的访问方式。

2. 当系统需要支持动态增加和删除全局对象时,可以使用注册模式。通过使用注册模式,可以实现全局对象的动态管理和访问。

3. 当系统需要提供一种简洁的接口来操作和访问全局对象时,可以使用注册模式。通过使用注册模式,可以将多个操作和访问全局对象的方法统一在一个接口中。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-注册模式(registry)》。

规格模式(Specification)

规格模式(Specification)是一种软件设计模式,用于描述对象的某些属性或条件。它将对象的属性或条件抽象成规格(Specification),并提供一种判断对象是否满足规格的方式。通过使用规格模式,可以将对象的属性或条件与具体的业务逻辑分离,提高系统的可维护性和可扩展性。

规格模式适用于以下场景:

1. 当系统需要描述对象的某些属性或条件,并且需要根据这些属性或条件进行判断时,可以使用规格模式。例如,一个电商网站需要根据商品的价格、库存等属性来判断是否可以购买。

2. 当系统需要将对象的属性或条件与具体的业务逻辑分离时,可以使用规格模式。通过使用规格模式,可以将对象的属性或条件抽象成规格,从而提高系统的可维护性和可扩展性。

3. 当系统需要支持动态组合和判断对象的属性或条件时,可以使用规格模式。通过使用规格模式,可以实现规格的动态组合和判断。

详细的代码示例介绍请关注公众号CTO Plus后面的文章《Python设计模式之行为型-规格模式(specification)》。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

到此关于Python相关的设计模式已经普及完毕,接下来的文章,我们分别使用代码示例的方式进行逐一演示。

Python专栏
https://blog.csdn.net/zhouruifu2015/category_5742543

更多精彩,关注我公号,一起学习、成长

图片

Python专栏
https://blog.csdn.net/zhouruifu2015/category_5742543


更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。

关于公众号的描述访问如下链接


更多精彩,关注我公号,一起学习、成长

关于Articulate“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个有深度和广度的技术圈。”一直以来都想把专业领域的技icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzIyMzQ5MTY4OQ==&mid=2247484278&idx=1&sn=2b774f789b4c7a2ccf10e465a1b9def6&chksm=e81c2070df6ba966026fd7851efa824b5e2704e3fd34e76228ca4ce64d93f7964cd4abe60f2b#rd

标准库系列-推荐阅读:


推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值