读了大话设计模式一书.暂做总结,有的理解了,有的还不太理解,以后慢慢理解
1.简单工厂模式
概念: 根据不同的条件初始化不同的对象
加减运算来说,声明一个运算类,然后各种运算都继承它,就是一种简单的工厂模式,虽然不见得就多好,讲的是这种思想
加上一个初始化控制逻辑,就是工厂模式,根据不同的条件初始化不同的对象
2.策略模式
概念:算法的封装,算法的工厂模式
它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户
看了半天,感觉就是工厂模式的升级版,,把计算部分做成了工厂模式
3.装饰模式
概念:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
继承并添加一些方法.不给原类扩展,只添加在子类上
原类不需要知道这些方法和扩展.
4.代理模式
算是最常用的模式之一了吧,规定协议方法,设置代理,用代理执行协议
5.工厂方法模式
概念:封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
父类给接口(协议)
在代理方法中初始化子类
子类再次使用工厂模式调用方法
有点胡
就是把判断工厂类型这一步,判断type这一步放在了代理里判断
写代理的时候再初始化
6.原型模式
概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
就是给类一个clone方法,方便类的复制
浅复制 只复制了指针地址
深复制 新开的地址,都复制了
7.模板方法模式
重写父类的方法
重复 = 易错 + 难改
利用了多态,子类重写父类的方法,利用父类的一些逻辑而减少代码量
8.外观模式
概念:为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
感觉就是tableview的那种代理形式,把具体的子视图通过代理抛出来
9.建造者模式 又叫生成器模式
概念:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
把一个复杂的对象的构建与它的表示分离,让同样的建造过程可以创建不同的表示意图
用户只需要制定类型就可以得到对象,而不用管具体的过程和细节
就是封装初始化方法喽,有时候需要一个指挥者,就是xx所谓的loginhelper喽
10.观察者模式
概念:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统
观察者模式也就是所谓的KVO
监听 发现变化后调用方法
怎么实现的?在set方法中加了几行
观察和被观察的对象都是抽象的
通知者 被通知者
被观察者 观察者(保留了被通知者的集合) 被通知者(遵循某协议或某父类)
11.抽象工厂模式
概念 : 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
抽象工厂模式就是对数据的抽象,也就是数据的访问给他建立一个父类
通过多态来初始化不同的数据,抽象了数据层
12.状态模式
概念:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
不同的状态设置不同的参数,在类中走不同的方法
多个不同的设置,从而看起来同一个类同一个方法却不像同一个类
13.适配器模式
概念: 将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
当我们要使用一个原有的类得接口
但是它和我们的类的要求不同的时候
我们可以建立一个中间类,来吧接口进行封装(有用过)
然后通过这个类提供的接口进行访问
14.备忘录模式
概念: 在不破坏封装性的前提下
保存对象的内部状态
这样可以将对象恢复到原先保存的状态
就是建立一个备忘录类
把对原类的封装细节给他,然后他负责备份并且提供到处导入方法
15.组合模式
概念:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 "组合对象" 的含义。
树状图的部分整体结构
同一个对象拥有树状图的 父亲 儿子 兄弟等.这样就是完整的组合模式
如果我们需要安全一点,可以把它的节点封装成方法
根据不同的节点提供不同的方法
通知可以利用多态,不同的节点拥有不同的子类
不同的子类有不同的方法
但是他们都拥有节点,通过方法添加关系
`组合模式的标志就是 树状图`
16.迭代器模式
概念:提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
提供一个能访问局和对象的方法
这个方法可以不暴露私有成员
当一个聚合对象(我理解为容器,有多个成员)
有多种方式进行遍历的时候
我们需要为聚合对象 提供以下接口
开始 下一个 石佛结束 当前的index 等接口
而不是把成员都暴露在外,让客户端进行查询和修改,这是不安全的
其实就是一个OC基本数据类型的实现
17.单例模式
概念: 保证只有一个实例,并且提供一个可以访问他的全局访问点
首先 懒加载的概念.避免对象重新初始化
单例是在懒加载的基础上对整个类的懒加载并且把它驻留在内存中
随时可以调用
向外抛出一个获得单例的方法,而不是每次都使用初始化方法
多线程访问单例可能会造成多个初始化,这个时候我们需要线程锁来保护,GCD已经帮我们做了,注意线程锁加载nil判断里.不用每次访问都添加线程锁
静态变量
恶汉式初始化, 一开始就初始化
懒汉式单例类 到结束的时候才初始化
18.桥接模式
概念:将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
首先我们有一个原则,就是继承不能有太多层次
优先使用聚合关系(拥有)
实现指的是抽象类和它的派生类用来实现自己的对象然后在它的抽象中提供对外的接口
比如手机品牌和手机游戏
手机游戏就是实现 手机品牌就是抽象
我们把手机游戏的实现单独拿出来,然后针对不同的品牌做接口
现在的游戏都是使用游戏引擎单独开发的,开发出来在针对不同的系统平台做接口
但是核心实现是一套
19.命令模式
概念:将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。
把一个请求封装为一个对象
这个对象有一个日志
有命令队列
并且命令队列可以根据执行状态进行回绝
这个对象就是服务员
服务员记录菜单,通知做菜的师傅, 统计菜单,统计命令,执行删除和回绝等任务.
20.职责链模式
多个对象都有机会处理请求
沿着链路传递请求,直到有一个能处理它为止
就是父类定义一个处理请求的方法
所有子类都继承了这个方法
子类可以选择向上传递,或者自己处理
客户端不需要谁来处理链路请求
链路中的对象不需要知道链路的结构
客户端传递请求的时候直到一个对象处理
21.中介者模式
系统作为一个整体,对系统的修改往往比较困难
用一个中介对象
来进行类和类之间的引用操作
就是所谓的viewmodel 其实
把引用从每个对象之间分离
对象只需要抛出方法就行了
中介者可以让我们从对象的本身转移到对象的交互上来
更宏观的观察各个对象
优点就是集中控制
缺点同上
就是所谓的manager
22.享元模式
概念:它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元
一些代码逻辑是可以共享的
享元模式分为内部状态和外部状态,其中内部状态是高度一致的代码逻辑,外部状态通常是每个对象的区别,他们共同组成一个享元对象
比如网站
核心代码+用户信息类
23.解释器模式
如果一种特定类型的问题发生的频率足够高
那么可能就值得将访问这个问题的实例来表述为一个简单的句子
这样就可以构建一个解释器(让我想起了枚举)
正则表达式
就是给一个句子或者语法
通过它来执行操作
24.访问者模式
写分类