设计模式解决问题步骤
1、寻找合适的对象(合适的分治、拆分)
面向对象设计最困难的部分是将系统分解成对象集合。因为要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、演化、复用等。(面向对象、面向接口编程、函数式编程的闭包,本质都是拆分,只是拆分的依据不一样)
2、决定对象的粒度
对象在大小和数目上变化极大。它们能标识下自硬件、上自整个应用的任何事物。
创建型
简单工厂模式:工厂类统一向外部提供创造方法,具体类都实现接口函数。
好处:1.良好的封装性,只要传进具体类名就可以了,不用知道具体的实现,降低耦合。
2.扩展性非常好,只要稍微修改工厂类或扩展工厂类,然后增加实现类就可以了。
只依赖提供的接口,实现解耦;使用子类替换父类,扩展性良好。
抽象工厂模式:把工厂类再抽象一次,向外提供的工厂类更加具体一些。
好处,可以解决更加复杂的业务逻辑,向外统一提供接口。
但是坏处是很多,因为互相依赖变多了,要扩展的难度比较大,涉及修改的类比较多。
模板方法模式:在父类中统一实现子类都相同的方法。
可以理解为在简单工程模式的基础上,各个具体类都有同一个方法而且实现都一样(处理逻辑都相同)。我们可以把这些相同的方法都在父类(工厂类)中实现。
好处:可以扩展的时候更加方便快捷,便于维护。
建造者模式:把建造方法都抽离出来,重复使用。
可以理解为在简单工厂创建很多同种具体类的时候,需要重复创建东西传进去,这个时候把创造方法抽离,每次只需要传数据进去就可以了。
好处:封装良好,不用关注建造细节;扩展性很好,各种具体类的建造是相互独立的。
原型模式:每个对象实现接口的个性化数据,共同的数据和方法抽离出来。
调用者用个性化数据替换占位符,其他的拷贝即可。当然实现的时候,可以根据实际情况选择是否需要深拷贝。
跟装饰模式很像。强调点不一样而已。
结构型
享元模式:对于不变的对象,可以放在一个对象池中,大家都使用即可,不用重复创建。(26个英文字符)
好处:小而多的对象可以节省不少空间。
组合模式:
通过创建几个组件对象,调用组合他们的方法,实现一个新的对象。
外观模式:
外观类可以调用组合方法,向外提供一个统一的接口。
桥接模式:(看黑皮的设计模式、RN的总结)
在策略模式的基础上,增加一层来实现A对B的调用组合,从而形成一组新的接口。
A接口的粒度较大,B接口的粒度较细,从而保证B已经实现的类不用改动,扩展的话只要实现新的即可。(A、B两侧变动,互不影响)
最好的例子就是OC和JS交互的模式、socket编程。
代理模式:把事情让代理去做,需要个性化的数据或逻辑的时候回调委托者提供的方法。
把相同的事情都统一抽离出来做成专业处理服务,大家都可以去委托它。
好处:1.封装良好,代理专注于提供某一种服务。
2.扩展性好,代理是可以嵌套代理的。
3.面向切面编程,实现AOP。
动态代理模式:把个性化定制的填空题变成选择题。类似于策略模式。
把需要个性化的定制的回调方法封装成几种情况(工厂模式),然后根据情况使用不用的定制化服务。
适配器模式:
就是代理模式中使用到的接口。根据接口或者运输载体,按照格式提供数据。
装饰模式:
入参是一个被创建的对象,这个对象实现了协议。类似于策略模式。跟代理模式只是方法的持有者不一样。
可以组装成具有不同特点的对象。
行为型
责任链模式:处理类根据请求类的level,在映射表中选择不同的处理类来处理,如果处理不了就交给更高级level的来处理。
责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家
好处:把请求和处理分开,解耦。
坏处:每个请求都要走一个请求链,可能性能有问题。
实现共有的代码块,特定的地方留下钩子。
可应用于自动化的个人投诉情况、DNS解析、事件响应链。
策略模式:http://blog.csdn.net/ydxlt/article/details/50434341
每个策略按照接口来自己实现,策略调用者随意创建一个策略执行接口函数就可以得到策略。
(从tableView的角度看VC来实现回调函数)
状态模式:http://blog.csdn.net/ydxlt/article/details/50441215
每个状态对象根据接口实现自己的方法,状态机根据现有状态创建一个状态对象执行接口函数,指针持有下个状态的状态对象。
(给策略模式加上状态机)
解释器模式:http://blog.csdn.net/ydxlt/article/details/50497909
等同于状态机
命令模式:把实现类通过不同的组合封装成命令类,然后通过操作Manager类选择执行不同的命令。(无接受者,等同策略)
好处:可以解耦,扩展性好,与模板方法模式结合可以减少子类膨胀的问题。
坏处:当命令的组合情况很多的时候,命令会异常庞大。
可以用于压缩文件的算法选择
中介者模式==MVC,其中的C就是中介着的角色。
MVC:C冲动V和M的中介,为它们直接的联系提供逻辑处理。
门面模式:制定流程类,通过给Manager类填入每个环境的数据,然后执行这个流程。跟函数是类是的。
可应用于计算工资。
观察者模式:
中介着模式就是固定对象的观察者模式。