看模板方法模式的顿悟


  设计模式,这个词听起来真的有种很高深没测的感觉,很想去弄懂它,总感觉要想成为技术大牛,如果连这个都弄不懂,就感觉太差劲了,但每次下定决心去看时,总是看不进去,要么觉得其中的术语太过于正式,很难看懂,还有就是总感觉看了也用不上。

  但今天在看模板方法模式时,才发现我已经使用过这个模式,只是自己不知道它就叫模板方法模式而已。

  首先我们来看模板方法模式的书面定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个定义实在是太讳涩了,我的理解是,如果我们有两个有很多相似代码的类时,我们常常会抽出一个公共的抽象类,把相同的代码放到这个抽象类中,同时把不同的代码,用抽象方法来代替,这些抽象方法再让子类去实现。其中的抽出来的公共的代码可以称之为算法的骨架(解决问题的主要步骤),由子类来实现的抽象方法就是将不同的一些步骤延迟到子类中。

  我们平时的把相同的代码抽到父类中去,其实这就是模板方法模式的思想,这个思想我们经常遇到,比如Activity这个类,其固定不变的生命周期方法,就可以认为是算法的骨架,我们通过继承这个类,实现其中的每个生命周期的方法,这就是将一些步骤延迟到子类中去。

  我们常常把相同的代码提到抽象的父类中去,也就我们常常用继承来实现模析方法模式,但这个方法有一定的局限性。我在写一套显示图片的缓存机制的时候,遇到了一个问题。问题是这样的,之前使用这套图片缓存机制的地方都是在ListView,GridView,GalleryView上,所以我可以写一个公共的Adapter(其继承于BaseAdapter),把相同的代码全部写在了这个Adapter上,变化的用抽象方法来表示,让子类去实现。

  但我后来发现使用这个图片缓存机制的地方除了ListView,GridView,GalleryView这些控件外,还会用在ViewSwitcher上,而使用这个控件是不需要BaseAdapter的,这时我有两种选择,一是:复制这些相同代码,另外单独再写一个类,二是:继续使用之前的公共Adapter,只是我不把它真正的BaseAdapter来用就行了。但我觉得这两种方法都不好,后来我想到的解决判法是:不用继承来重用代码,用组合加Java回调技术来重用代码。

  这时我就不把相同的代码写在抽象类里了,而是直接写在一个类里面,原来在抽象类里的抽象方法,我定义了一个接口,这个接口由使用这个公共类的类去实现,在公共类里,我只使用这个接口对象,这样同样也实现了为离相同的代码,变化的部分由使用者去实现,这样我就可以摆脱Java只能继承一个父类的问题,从而把使用ViewSwitcher和Listview,GalleryView,GridView的图片缓存机制的代码写在一块了。

  总结:Java回调方法和继承抽象类是实现模板方法模式的两种不同的实现。但我在解决这个问题的时候,并不知道自己就是使用模板方法模式。其实设计模式并没有那么高深和遥远,其实我们天天都在使用。看设计模式要结合自己的实际工作,从中进行总结和思考,只有这样才能真正的理解和掌握设计模式,才能真正的活用设计模式中的思想。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值