行为型设计模式
目录
13.观察者模式设计思想
01.观察者模式基础
- 主要解决什么问题呢?一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
- 模式动机:建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。
- 定义:定义对象间一对多依赖关系,当一个对象状态发生改变,其依赖对象都会收到通知并自动更新。
02.观察者模式实现
需求: 微信公众号。当你关注的公众号中有新内容更新的话,它就会推送给关注公众号的微信用户端。
大概实现的思路是这样:
- 第一步:抽象观察者。定义一个接口,包含一个更新的抽象方法。
- 第二步:具体观察者。继承接口,实现抽象方法。
- 第三步:观察对象。定一个观察接口,包含添加订阅者,删除订阅者,通知订阅者抽象方法。
- 第四步:具体观察对象。具体主题角色类需要实现观察接口,然后用一个list集合存储观察者对象
- 第五步:测试,创建公众号对象,然后添加用户订阅公众号,公众号更新
03.观察者模式分析
观察者模式包含如下角色:
- Subject: 目标。
- ConcreteSubject: 具体目标。
- Observer: 观察者。主要是用来添加,移除观察者,当有消息时,会触发遍历通知具体观察者
- ConcreteObserver: 具体观察者。比如,程序员A,B,C,D,都关注了技术公众号
04.观察者模式优缺点
- 主要优点:在于可以实现表示层和数据逻辑层的分离,并在观察目标和观察者之间建立一个抽象的耦合,支持广播通信;
- 主要缺点:在于如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间,而且如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
05.观察者模式使用
使用环境分析:一个对象改变导致其他多个对象也发生改变,可以降低对象之间耦合性。
应用场景:记住一句话,凡是涉及到一对多交互场景,则可以使用观察者模式。比如公众号订阅,邮件订阅,网站发送打折优惠券等。
14.策略者模式设计思想
01.策略模式基础介绍
由来介绍:完成一项任务,可以有多种不同的方式,每一种方式成为策略,可以根据环境或者条件不同完成不同任务,这个就是策略模式由来!
策略模式定义:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
应用场景:
- 行为切换:当系统的许多类的区别仅在于其行为不同时,可以使用策略模式将这些不同的行为动态地让用户对象在其间进行选择。
- 算法选择:在需要动态地在几种算法中选择一种的场景下,也可以使用策略模式。
策略模式主要是为了解决 if-else 分支判断逻辑的吗?其实除了实现同样功能,重点在于解耦合,让每种策略单独实现,降低代码复杂度,添加或者移除策略时不影响老代码。
策略模式是一种行为型设计模式,它主要用于解决算法选择问题。其主要特点在于能够将一系列算法封装起来,并让它们可以互相替换或独立于使用它的客户而变化。
02.策略模式原理
根据描述,折扣是根据以下的几个算法中的一个进行的:
- 算法一:对初级会员没有折扣。
- 算法二:对中级会员提供10%的促销折扣。
- 算法三:对高级会员提供20%的促销折扣。
- 算法四:对钻石会员提供30%的促销折扣。
第一种实现方式:使用if-else分支实现该业务。如果再多增加几种优惠类型,那么业务就更加复杂了。让逻辑更加复杂,在维护和拓展这块,将会导致代码越来越臃肿!
第二种实现方式:抽象出折扣接口,然后分别创建初级会员策略类,中级会员策略类,高级会员策略类,钻石会员策略类。然后根据环境使用不同策略完善折扣汇算的功能。符合开闭原则,方便拓展,好维护!
03.策略模式结构
策略模式包含如下角色:
- 环境(Context)角色:持有一个Strategy的引用,即具有复杂多变行为的对象。
- 抽象策略(Strategy)角色:抽象策略类,这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(ConcreteStrategy)角色:具体策略类,包装了相关的算法或行为。一般实际场景中会有多个
05.策略者模式分析
策略模式的优点在于降低系统的耦合度,提高系统的灵活性和扩展性。缺点在于增加了系统的复杂性和理解难度。
15.模版模式设计思想
- 定义:在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
- 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
- 主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
- 场景举例:
- 何时使用:有一些通用的方法。
- 如何解决:将这些通用算法抽象出来。
- 关键代码:在抽象类实现,其他步骤在子类实现。
- 优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
- 缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
- 使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
https://zhuanlan.zhihu.com/p/465594915
16.迭代器模式设计思想
- 定义:将集合的遍历逻辑与集合对象的实现分离。通过迭代器,客户端代码无需关心集合的底层实现方式,就能顺序地访问集合的每一个元素。
- 意图:
- 主要解决:
- 场景举例:
- 何时使用:
- 如何解决:
- 关键代码:
- 优点:
- 缺点:
- 使用场景:
17.中介模式设计思想
- 定义:中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。
- 意图:
- 主要解决:
- 场景举例:MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者。通过控制器
- 何时使用:
- 如何解决:
- 关键代码:
- 优点:
- 缺点:
- 使用场景:
19.命令模式设计思想
- 定义:
- 意图:
- 主要解决:
- 场景举例:MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者。通过控制器
- 何时使用:
- 如何解决:
- 关键代码:
- 优点:
- 缺点:
- 使用场景: