设计模式初版讲解

前文

  《人人都懂设计模式》是少数围绕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.解决了二级分类
缺点:如果超过二级,则会变的很臃肿

其他模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值