head first 设计模式,是比较有趣的一本设计模式的书。html
在学校里看书和在工做时看书,意义是不同的。在学校时是为读书而读书,咱们能够从0到1,咱们有的是时间。可是工做后就不同。java
我以为这时的书更像是打通本身任督二脉的武功秘诀。在平时工做中,杂七杂八地学了一些东西,可是却不能融会贯通。因此还须要经过书来厘清你的思路。这是写本文的出发点,也是个人碎碎念!算法
看完该书后,转换成本身的语言,再表达出来,可能有错(那是必定的),可是,有总比没有好。若是有同窗可以从中获得些启发,也算是本身的一种幸运吧!编程
我竟试图以一句话来描述一个设计模式!设计模式
策略模式!缓存
将统一的东西做为基类,可变的东西行为独立出来,在基类中经过变量进行引用,经过委托变量的方式,使用setter方法将委托变量改变,使其具备行为可变性。面向接口编程,而非面向类编程。其好处是,用一样的接口,经过不一样行为类的传入产生不一样的效果,便以改变行为变得容易。ruby
观察者模式!多线程
相似于发布-订阅模式。存在注册服务,通知的过程。其实现方式能够理解为,注册服务时,将观察者加入到队列当中,当主题发生变动时,由主题主动依次从观察者队列中依次调用,从而达到通知主动推送的做用。其好处是,观察者随时注册观察能够实时收到消息,而被观察者对此一无所知,从而在达到通知的同时也解藕了。并发
装饰者模式!mvc
以某对象为主要对象,生成后,将其传入装饰者构造函数中,通过装饰后,再行输出的模式。该模式,能够许多散乱的方法独立组装出来,而不会影响其余变化,该模式是经过继承来实现的。典型的装饰者模式运用,java io 类的继承,有多个主类,及多个装饰类,从而方便用户操做想要的方法。其好处是,在大方向不变的状况下,能够反复更改主要的行为结果,对于一些附加类的变化,能够很方便地经过该模式进行数据再加工。
工厂模式!
分为简单工厂模式-工厂模式-抽象工厂模式。所谓工厂模式,便是将须要的产品和工厂结合在一块儿,从而获得一个具体须要的产品的一个过程,而无需知道这个产品具体是由谁生产的。工厂模式很好的复用了多个产品的变化性,避免了在各个类中进行各自实例化从而致使类的散乱问题。或者从另外一个角度来讲,工厂只是某段复用性很高的代码的抽离而已。其好处是,统一把控了一些类的生成,避免了各个类散落在代码各个角落,从而给后期升级维护带来方便。
单例模式!
就是全局只有一个实例对象的访问方式(单进程方式)。须要一个私有构造器,使外部没法实例化他,须要一个静态方法getinstance供外部访问实例使用,属于懒加载行为。但应注意多线程并发问题,从而建立两个instance,使用synchronized同步方法或者volatile同步本实例,从而解决并发问题,可是这会致使应用性能下降100倍的性能。当应用中大量使用单例,就得考虑是否合理了,由于适合单例的场景并不不少。其好处是,减小系统反复建立一个类时的性能开销及空间开销,且能够多处共享一些变量(若是须要的话)。
命令模式!
将请求看成对象传递给另外一对象,从而实现命令的执行方式。使请求与执行解藕开来,能够很方便地实现命令集操做,或者宏操做及回放。可以轻松实现日志队列操做。其好处是,将命令请求和命令执行分开,通常请求都会很快完成,可是执行却不必定,因为请求与执行分开,因此可以轻松实现过后补偿的动做。
适配器者模式!
即实现A接口转换B接口的适配工做,如实现链接三角插座与两脚插头链接工做,适配器的意义在于不用改变或不能改变现有接口的同时,将新的接口接入现有环境,意义重大。其实现为,适配器继承目标接口,并传入被适配接口,将被适配接口的逻辑转换成目标接口的表述。能够继承多个接口实现双向转换。其好处是,不对现有代码进行改动的状况下接入新厂商的东西,适应原有方式。
外观模式!
外观模式的意图在于提供简化的接口操做,同时,也不改变原有接口。其实现是一种类的包装简化。其遵循一个设计原则,只与最亲密的人交谈。其好处是,将原有复杂多变的接口转化为少且实用的几个接口,使外部调用时,只作最简单的事。
模板方法模式!
在一个父类接口中定义一个算法骨架或者操做流程,并将一个子类特有的方法以抽象方法的方式暴露出来,使在运行时使用父类的操做流程调用子类的特有方法的方式。该模式能够省去许多机械代码,使子类只关注本身特有的部分。本模式中,还有一个平凡而重要的概念,钩子hook,钩子在java中表现出来就是,一个只有空的方法或者默认实现的方法,子类只要对该方法进行覆盖,就能够触发钩子,从而实现开关控制和本身的意图。由于是高层调用低层,因此存在有些操做的不明显,若是低层又调用高层的话,将很难搞清楚设计,所以应遵循一个原则,好莱坞原则,只有父类调用子类,子类不得调用父类,所以若是想知道框架中为何要让你必须实现某个方法时,只需到父类中查看其调用一下便知,但不得私自调用父类方法。依赖倒置原则和这有点像。其好处是,将复杂流程封装起来,只提供可变的方法让子类重写,从而在父类调用,减小许多重复的代码。
迭代器模式!
也就是实现像iterator 接口同样功能的方式,使对象可以不关注内部实现的状况下遍历元素。目前对咱们来讲,应该是没什么意义了,由于相似于for in 的语法,已经彻底可以达到此类效果,该模式我的感受没多大意义。其好处,就是为了方便使用的地方可以遍历出内部结构。
组合模式!
即将多个接口具备的方法,组合在一块儿变为一个更大的接口,让操做者无需关注各种的差别,只管调用相同接口便可,可是对于有些子类没有的方法则须要抛出异常,以使外部进行捕获。使用场景得细细思量一番才行。这个功能,在gui编程时最明显,当你拖动几个系统提供的组件,在页面上组合出新的结构时,就是利用了组合模式了。
状态模式!
与策略模式相似。其做用是控制外部操做在内部的状态流转,并没有需让外部知晓,其操做实际上是将一系列的if else解放出来,使逻辑更清晰。其实现为封闭整个流程的全部状态,在用户操做某一状态后,该状态只会作本身的事,并将状态转换到下一状态,用户进行下一操做时,内部已改变,可是对类内部来讲,操做的还是单一状态,所以逻辑清晰。可是该模式会产生大量状态类,增长大量代码,且需抽象出良好的状态,比较考验技术水平。其做用是,便逻辑更清晰,也更容易扩展。
代理模式!
即访问对象不经过直接访问的方式,而是去访问代理让代理去跟具体对象沟通,沟通好后将结果返回给访问者,这里通常会涉及到rmi远程调用,代理模式减少了系统的复杂度(至少到调用者是的)。虚拟代理,缓存代理,同步代理,防火墙代理,写入时复制代理。代理模式在现实中用的是很是普遍的,他为咱们屏蔽许多复杂细节,由框架提供的代理,使咱们操做方便的同时,也让咱们变得傻瓜。
复合模式!
即组合混合使用了多个模式的模式,该模式准确说不算是模式,可是也在框架中体现的最多的模式,如著名的mvc。组合策略,适配器,观察者,装饰器,组合模式,工厂等等。其好处是,在基础模式的基础上,再封装出另外一实用模式,解决更具体的应用场景问题。
16.更多!
模式是某种情境下针对某种问题的某种解决方案。其余模式,访问者模式,中介模式,原型模式,桥接模式,责任链模式,。反模式,即很差的模式,表面看起来好,实际用以后会有大坑。
来源:等你归去来
连接:http://www.cnblogs.com/yougewe/p/8240977.html
更多干货领取可关注公众号后回复“干货”便可免费领取海量干货