一:责任链模式
含义:为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦;具体的来说就是每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推;
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。
例子:runtime消息执行机制。先寻找当前类方法,如果没有再找父类依次类推;
二:命令模式
含义:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令;
用例:GUI中的每个按钮都是一条命令,步骤为 调用者(button)→接受者(self)→命令(执行);
使用场景:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
个人理解:就是将代码分开,松耦合;命令可以通过不同参数执行一套代码,而不用一个命令一个方法;
三:解释器模式
含义:提供了评估语言的语法或表达式的方式,这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
备注:OC中目前个人还没遇到过或者说遗漏了;
四:迭代器模式
含义:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
使用场景:1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
用例:FMDB的 [result net],字典和组织的遍历NSEnumerator *enumerator =[dic/arr objectEnumerator]->[enumerator nextObject]
五:中介者模式
含义:是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护;
使用场景:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
用例:MVC 框架,其中C(控制器)就是 Model(模型)和 View(视图)的中介者
总结:
(1).这里让我想到了桥接模式,从模式来说:桥接模式是结构,中介者是行为,那么可以这样说结构定义好了,是不可变的,行为是可变的。桥建好了,至于两端大陆怎么变是不管的,而中介者有自己的行为,他可以决定让不让两端建立连接,以怎样的方式建立连接;
(2).MVVM用的是桥接模式,C控制器是绑定View 与 ViewModel的桥梁,不负责他们之间的交互;而MVC用的是中介者模式,是控制Model与View的交付;
六:备忘录模式
含义:保存一个对象的某个状态,以便在适当的时候恢复对象。
使用场景:顾名思义就不再过多阐述;
用例:游戏存档;
优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
七:观察者模式
含义:当一个对象被修改时,则会自动通知它的依赖对象;
使用场景:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。实时性更强;
使用注意:避免造成循环引用,合适的时机移除观察者;
八:状态模式
含义:类的行为是基于它的状态改变的;
使用场景: 1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。
用例:自定义了一个View,当文件未下载是显示待下载,在上传时自动转圈,在下载完成后显示已完成;
九:空对象模式
待补充
十:策略模式
含义:一个类定义好一个策略后,它的行为或其算法可以在运行时自动更改;
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
用例:一个类暴露了两个参数,而它的策略有加、减、乘;当策略定义好以后,传入两个参数自动计算其结果;
十一:模板模式
含义:个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行;
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
用例:网络请求类每次请求接口都需要上传系统时间、用户id等,此时就可以将它封装起来;
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
十二:访问者模式
含义:我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
使用场景:访问一个对象,根据对象的不对反馈信息,做出不同的选择;
用例:去朋友家访问朋友,朋友告诉你有篮球、羽毛球、乒乓球等,你得到这些信息以后,做出选择玩什么的判断;
优点: 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。
缺点: 1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。