• 设计模式初版讲解


    前文

      《人人都懂设计模式》是少数围绕Python的语言来讲解主流设计模式,作者的思路清晰,而且例子也非常的简洁易懂,特别适合快速学习设计模式相关,这里总结了设计模式的定义和特征。

    监听模式:

    定义:

    Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically. 在对象间定义一种一对多的依赖关系,当这个对象状态发生改变 时,所有依赖它的对象都会被通知并自动更新。

    特征分析:

    1.分为监听者/被监听者(观察者/被观察者)
    2.监听者需要记录/移除被监听者,可搭配装饰器形成自动注册机制来自动完成这块

    应用场景:

    (1)依赖对象更新
    (2)消息推送

    状态模式:

    定义:

    Allow an object to alter its behavior when its internal state changes.The object will appear to change its class. 允许一个对象在其内部状态发生改变时改变其行为,使这个对象看 上去就像改变了它的类型一样。

    特征分析:

    1.有点类似于策略模式,当自身状态变更的时候,会变更行为,又称为对象的行为模式;
    2.适用于解决很多if-else的类、函数
    3.每一种状态应当只有唯一的实例(对状态用单例模式,可以借助装饰器实现)

    举例分析:

    1.最典型的比如,水有3个状态:固液气,当温度升高转变为气态,有什么行为展示。实现可以通过定义状态基类,3个状态类继承基类并加上单例装饰器。再来个水自身类,通过add_state注册各个状态类,当水温度变更,则遍历所有状态类,看其变更符合哪个,则转变为哪个类,实现了状态切换规则。然后再执行对应类的行为
    优点:1.集中管理状态;2.
    缺点(同策略模式):1.增加系统的类数量;2.系统架构变得更复杂

    应用场景:

    (1)对象的行为取决于它的状态,并且它在运行时可能经常改变它的状态,从而改变它的行为。
    (2)大量的if-else,这些分支依赖于该对象的状态,且每一个分支的业务逻辑都非常复杂

    中介模式(调停模式):

    定义:

    Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

    特征:

    1.分为中介类和交互对象
    2.中介类集成所有实现,将网状关系变成单一关系
    优点:1.多对多变为1对多;
    缺点:1.中介类复杂;2.中介类异常影响所有交互类

    装饰模式:

    定义:

    Attach additional responsibilities to an object dynamically.Decorators provide a flexible alternative to subclassing for extending functionality.动态地给一个对象增加一些额外的职责,就拓展对象功能来说,装饰模式比生成子类的方式更为灵活。

    特征:

    1.灵活地给对象增加职责或者拓展功能
    2.多个装饰器间的顺序不同,效果不同
    优点:1.比继承更灵活;2.解耦
    缺点:1.不易排错

    单例模式:

    定义:

    Ensure a class has only one instance,and provide a global point of access to it.确保一个类只有一个实例,并且提供一个访问它的全局方法。

    特征:

    1.类有且只有一个
    2.考虑线程安全可能需要加线程锁

    克隆模式(原型模式):

    定义:

    Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.用原型实例指定要创建对象的种类,并通过拷贝这些原型的属性来创建新的对象。

    特征:

    1.在Python中用copy和deepcopy来实现;除了需求要求复制前后对象需要一起改变才用到copy
    优点:1.拷贝复杂对象尤其方便
    缺点:不会执行init函数

    职责链模式(职责模式):

    定义:

    Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.
    为避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求。将这些接收对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

    特征:

    1.发送者和接收者解耦
    2.接收者有多个,可以自由组合形成链条

    应用场景:

    1.审批

    代理模式:

    定义:

    Provide a surrogate or placeholder for another object to control access to it.
    为其他对象提供一种代理以控制对这个对象的访问。

    特征:

    1.分为真实类、代理类;代理类代替真实类完成操作
    优点:1.可以解耦2.可以增加额外功能
    缺点:1.代理类需要额外工作,可能非常复杂

    迭代模式:

    定义:

    Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
    提供一种方法顺序地访问一组聚合对象(一个容器)中的各个元素,而又不需要暴露该对象的内部细节。

    组合模式:

    定义:

    Compose objects into tree structures to represent whole-part hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.
    将对象组合成树形结构以表示“整体-部分”的层次结构关系。组合使得用户对单个对象和复合对象的使用具有一致性。

    特征:

    1.部分与整体的关系;具有层次关系
    优点:1.调用简单;2.灵活增伤
    缺点:层次过多的,容易庞杂

    构建模式:

    定义:

    Separate the construction of a complex object from its representation so that the same construction process can create different representation.
    将一复杂对象的构建过程和它的表现分离,使得同样的构建过程可以获取(创建)不同的表现。

    与工厂模式的区别

    工厂模式 关注的是整个产品(整体对象)的生成,即成品的生成;而构建模式 关注的是产品的创建过程和细节,一步一步地由各个子部件构建为一个成品。
    比如要创建一辆汽车,如果用工厂模式,直接就创建一辆有车身、轮胎、发动机的能用的汽车。如果用构建模式,则需要由车身、轮胎、发动机一步一步地组装成一辆汽车。

    与组合模式的区别

    组合模式关注的是“整体-部分”的关系,也就是关注对象的内部组成结构,那么它与构建模式又有什么区别与联系呢?
    区别: 组合模式关注的是对象内部的组成结构,强调的是部分与整体的关系。构建模式关注的是对象的创建过程,即由一个一个的子部件构建一个成品的过程。
    联系: 组合模式和构建模式其实也经常被一起使用。

    适配模式:

    定义:

    Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
    将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。

    适配模式的作用:

    (1)接口转换,将原有的接口(或方法)转换成另一种接口。
    (2)用新的接口包装一个已有的类。
    (3)匹配一个老的组件到一个新的接口。

    策略模式:

    定义:

    Define a family of algorithms,encapsulate each one,and make them interchangeable.Strategy lets the algorithm vary independently from the clients that use it.
    定义一系列算法,将每个算法都封装起来,并且使它们之间可以相互替换。策略模式使算法可以独立于使用它的用户而变化

    工厂模式:

    简单工厂模式:

    Define an interface for creating an object,it through the argument todecide which class to instantiate.
    定义一个创建对象(实例化对象)的接口,通过参数来决定创建哪个类的实例。
    优点:1.简单;根据参数创建
    缺点:不符合开闭原则,需要修改if…else…

    工厂方法模式:

    Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.
    定义一个创建对象(实例化对象)的接口,让子类来决定创建哪个类的实例。工厂方法使一个类的实例化延迟到其子类
    优点:1.解决了开闭原则
    缺点:对于有二级分类的产品,不适用

    抽象工厂模式:

    Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
    提供一个创建一系列相关或相互依赖的对象的接口,而无须指定它们的具体类。
    优点:1.解决了二级分类
    缺点:如果超过二级,则会变的很臃肿

    其他模式

    备忘模式、享元模式、命令模式、外观模式、访问模式、模板模式、桥接模式、解释模式

  • 相关阅读:
    MySQL知识总结
    人工智能与机器学习
    Vue07/Vue dynamic动态组件
    旅游景区一体化污水处理设备产品特点
    Redis数据类型-String-基本使用和原理
    Windows平台Unity下实现camera场景推送RTMP|轻量级RTSP服务|实时录像
    【Jmeter】什么是BeanShell?
    docker常用命令(云容器)
    嵌入式软件有限状态机的 C 语言实现
    ARM汇编指令
  • 原文地址:https://blog.csdn.net/weixin_42681866/article/details/128128279