面向对象,通过封装、继承、多态把程序的耦合降到最低。灵活,易修改,易复用。
- 简单工厂模式 违背了开放-封闭原则
- 策略模式 : 封装算法,实践中,可以用来封装几乎任何类型的规则,处理规则变化。
- 单一职责原则 :就一个类而言,应该仅有一个引起它变化的原因。
软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。 - 开放-封闭原则:软件实体(类、模块、函数等等),应该可以拓展,但是不可以修改。
- 依赖倒转原则:
- 高层模块不依赖低层模块,两个都应该依赖抽象(即接口或者抽象类)。
- 抽象不依赖细节,细节依赖抽象。(即 针对接口编程,而不是针对实现编程)
里氏代换原则:子类型必须能够替换掉他们的父类
- 装饰原则:把类中的装饰功能从类中搬移取出,简化原有逻辑。有效的吧类的核心职责和装饰功能区分开了,并可以去除重复的装饰逻辑。
7.代理模式:为其他的对象提供一种代理,以控制对这个对象的访问。
远程代理、虚拟代理、安全代理、智能指引
8.工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个雷的实例化延迟到其子类。 缺点是还要修改客户端的代码。
9.原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。 (复制对象实现Cloneable接口)
深复制:把引用对象的变量指向父之过的新对象,而不是原有的被引用的对象。(被复制对象和复制对象都实现Cloneable接口)
10.模板方法模式: 定义一个操作中的算法的股价,将一些步骤延迟到自列中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
注意:当子类中重复与不重复的代码混杂时,把重复的代码搬到父类,不重复的(特有的)用虚方法或抽象方法延迟到子类中实现。在父类中定义一个整体的骨架方法,通过这个方法把父类的实现和子类的实现整合在一起完成功能。
11.迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
注意:强调了类之间的松耦合,便于修改
12.外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
注意:把一系列具有一定联系的子系统功能整合到外观类的一个方法中,复杂的交互都由外观类完成,客户端只需要调用外观类的方法即可。外观类就像一个形象良好的接口,供客户端简洁的调用。
13.建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
注意:把一系列稳定的、普遍的、复杂的装配过程放在指挥类中完成,定义抽象父类,用多态去创建不同的子类(产品),用户只需要调用指挥类并指定产品即可。把复杂的装配隔离到指挥类。
14.观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(通知者)。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
注意:当一个对象变动时要通知其他不定个数的对象。变动的类相当于通知者,被通知的类相当于观察者。可以用集合实现,双方都依赖于抽象(通知者有抽象通知者,观察者有抽象观察者,这样会很容易扩展)。也可以用委托,大大减少耦合(观察者必须指定通知者,也就是让谁通知)。
15.抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。
注意:简单工厂模式----工厂方法模式(抽象工厂来分离工厂功能)----抽象工厂模式(细化抽象,把每一个分开的小工厂继续细化,再分成不同的方法(接口方法),创建该工厂的又一个分支,实现当前工厂下的多功能。)。
反射理解:反射就是可以动态的创建不同类的实例,把创建实例从编译时改成运行时。可以在工厂模式中替换switch、if等分支语句。反射要求以字符串的形式传入要实例化的类,所以可以用变量代替,大大的增加了灵活性。
因为开发-封闭原则告诉我们,对于扩展我们开放,对于修改,尽量关闭。所以
反射+抽象工厂来规避修改
反射+配置文件来更加灵活配置程序,应对拓展,
16.状态模式:当一个对象的内在状态变化时允许改变其行为,这个对象看起来像是改变了其类。
注意:状态模式要解决的额是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列(子)类当中,可以吧复杂的判断逻辑简化。
状态模式的好处是将特定状态相关的行为局部化,并且将不同状态的行为分割开来。
17.适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。使得原本由于接口不兼容儿不能一起工作的那些类可以一起工作。(简单理解就是接口修改统一)
18.备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
19.组合模式(composite):将对象组合成属性结构以表示“部分-整体”的层次结构。组合模式使得用户单个对象和组合对象的使用有了一致性。
好处就是客户不用关心对象是单一的叶节点还是组合组件,也不用为定义组合组件而写一些选择判断语句了。
使用场景:需求体现部分与整体层次的结构时,以及你希望用户忽略组合对象与单个对象的不同,统一使用组合结构中的所有对象时。
20.迭代器模式:提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
21.单例模式:保证一个类仅有一个实例,并提供一个访问它的全局站点。
多线程时的单例:加锁,OC中可以使用dispatch_once,只会访问一次,注意单例类要自己实现copy协议,避免被拷贝修改,违背单例原则。
22.桥接模式:
合成/聚合原则:尽量使用合成/聚合原则(弱),尽量不要使用类继承(强)
合成/聚合原则: 合成是强的“拥有“关系,聚合是弱的”拥有“关系。
好处是:优先使用队形的合成/聚合原则有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不大可能增长为不可控制的庞然大物。
桥接模式:将抽象部分与他的实现部分分离,使他们都可以独立地变化。
注意:这里实现指的是抽象类和他的派生类用来实现自己的对象。
‘将抽象部分与他的实现部分分离’ 还是比较难以理解,可以理解为:实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合。
23.命令模式:经一个请求封装成一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
优点:
- 能较容易的设计一个命令队列
- 在需要的情况下,可以较容易的将命令记入日志
- 允许接收请求的一方决定是否要否决请求
- 可以容易的实现对请求的撤销和重做
- 由于加进新的具体命令类不影响其他的类,隐藏增加新的具体命令很容易
- 关键是命令模式把请求一个操作的对象与指导怎么执行一个操作的对象分割开
24.职责链模式:是多个对象都有机会处理请求,从而避免请求的发送者和接收者之前的耦合关系。将这个对象看成一条链,并沿着这条链传递该请求,指导有一个的一项处理它为止。
优点是降低耦合,增加灵活性。
25.中介者模式:用一个中间对象来封装一系列的对象交互。终结者模式使各个对象不需要显示的相互引用,从而时期耦合松散,而且都可以独立的改变他们之间的交互。(组件化中间件思想)
26.享元模式:运用共享技术有效的支持大量细粒度的对象。
27.解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
正则表达式
28.访问者模式:表示一个作用于某对象结构中的个元素的操作。它是你可以在不改变吧各元素的类的前提下定义作用于这些元素的新操作。
适用于数据结构相对稳定的系统。
优点是增加新的操作(访问者)很容易。访问者模式会将有关的行为集中到一个访问者对象中。