什么是设计模式?
在软件开发中,经过验证的,用于解决在特定环境下,重复出现的特定的问题的解决方案。
设计模式分为三大类:创建型,结构型,行为型.
创建型:
1,抽象工厂模式
提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.
理解:
一个抽象类,然后里面可以有 A B C 三种类来实现抽象类的的具体实例化.
2,工厂方法模式
定义创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类.
理解:
定义一个父类,实现一个父类方法,三个子类继承这个父类,分别重写父类的方法,调用的时候,可以用一个父类的指针指向子类的对象,然后子类分别实例化,调用父类的抽象方法,分别实现子类的方法(OC的多态).
3,原型模式
使用原型实例创建对象的种类,并通过复制这个原型创建新到的对象.
理解:
OC中的copy
4,单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点.
理解:
OC中的单列
5,建造者模式
是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
理解:
同样一道菜,同样的用料,不同的厨师作出来的味道是不一样的,具体到代码里,创建一个组织者的类,这个组织者可以抛出一个创建方法,有好几个具体建造者的实现类,用户端使用的时候,创建一个组织者对象,然后传入不同的创建者类,会怒实现不同形式的对象.
结构型:
6,适配器模式
将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.
理解:
就是想办法在原来接口实现的基础上再封装一层加入一些额外的自己的逻辑实现,OC中的一种实现方式:定义了一个tagert类,有一个handle实现方法,可以再定义一个reTargert类,将targert定义成reTargert的成员变量,定义自己的handle方法,内部通过[self.targert handle]的方式包含原来的实现,再加入自己的处理逻辑,也可以直接写成target的子类,通过[super handle]的方式包含原来的逻辑,再加入自己的处理.
7,桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化.
理解:
OC中有两个抽象类 A 和 B,然后A和B分别有三个具体的子类。A1 A2 A3和B1 B2 B3,抽象A 调用抽象B的方法,用不同的具体类实现会有 很多的的组合方式.但是具体类之间不进行直接调用.
8,组合模式
将对象表示成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.
理解:
用于树型结构的场景,例如公司架构,文件架构,等等,可以统一的调用某个接口氏树下的所有组合元素都执行
9,装饰者模式
动态地给一个对像添加一些额外的职责.就扩展功能来说,装饰模式相比于生成子类更为灵活.
理解:
总是就是要对原来的类活着对象添加一些额外的功能,OC里面通常有两种方式,写子类,写分类,这里面说的装饰者模式有别于直接写子类,比如说对类A有一个方法test,A写一个子类B,B是A的子类,且重写了A的test方法,并且有一个类型为A的属性,B的test里面通过【self.A test】的方式实现自己的test,然后B又又自己的子类 B1 B2 B3,分别重写了B的test方法,就可以通过B1.A = B,B2.A = B1,B3.A = B2,的方式无限扩展A的test方法,这种模式跟直接一层一层的写子类很像,但是又有别于它,很神奇。另外还可以通过直接写A的分类的方式对A进行直接扩展。
10,外观模式
为系统中的一种接口提供一个统一的接口,外观定义一个高层的接口,让子系统更易于使用。
理解:
就是一个manager类,抛出一个接口,而manager类内部有许多的职能类去分别实现不同的业务,用户只需要调用manager类抛出的接口而不必关注其内部的具体职能类簇.
11,享元模式
运用共享技术有效地支持大量细粒度的对象.
理解:
享元的的目的是为了减少同一对象的大量创建,OC中许多地方其实用到了享元模式,cell的重用机制等.
12,代理模式
为其他对象提供一种代理以控制对这个对象的访问.
理解:
OC中的delegate
行为型:
13,责任链模式
使多个对象都有机会吃处理请求,从而避免请求对的发送者和接收者之间发生耦合,此模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止.
理解:
一种应用场景是组织架构的批示业务,经理,总经理,董事长,OC代码结构上是一个链状结构,使用端掉用经理这一个节点,处理的了就return,处理不了就抛给上一级,都处理不了再return.
14,命令模式
将请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.
理解:
关键词“将一个请求或者操作封装为一个对象”,这个对象可以定义处理取消这些方法,然后再创建一个manager管理类,通过队列的方式统一管理这些请求.
15,解释器模式
给定一个语言,定义它的文法的-种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子
理解:
正则表达式
16,迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表达.
理解:
17,中介者模式
用一个对象来封装一系列对象的交互方式.中界者使各个对象不需要显式地相互引用.从而使耦合松散,而且可以独立地改变他们之间的的交互.
理解:
多对多模式,iOS的模块化之间的通信,减少类与类之间的直接import引用,降低类与类之间的额耦合性.一般通过openURL的方式,结合一个映射表,runtime机制实现调用.
18,备忘录模式
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原线保存的状态.
理解:
场景,数据库回退,保持一个View的状态,应该提供一个存储中心,包含状态存储,状态恢复的方法,存储的对象应准守一个协议,这个协议包含一个可获取对象状态和恢复对象状态的方法.
19,观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.
理解:
OC中的KVO
20,状态模式
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类.
理解:
Swith Case语句.
21,策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换,本模式使得算法可独立于使用它的客户而变化.
理解:把多变的算法簇接口簇独立出来封装.
22,模版方法模式
定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模版方法使用子类可以重新定义算法的某些特定步骤而不改变该算法的结构.
理解:
假如我要定义一个本地数据存储的类,那么我可以定义一个抽象的方法,需要传入相应的参数,内部实现可以有多种形式,可以是sql3,可以是FMDB,可以是沙盒
23,访问者模式
某些可作用与一个对象上的操作,但不修改这些对象的类.
理解:
访问者,访问元素,访问元素集合.被修改的对象只需要抛出一个可以被访问的方法,这个方法理被访问者以参数的形式传递出去,然后访问者在自己的内部去修改被访问者.