介绍和实现:
- 策略模式的结构其实非常简单,比模板方法模式简单多了,它实质上就是一个原则的体现,往低里说就是里式替换原则,往高里说是依赖倒置原则,具体实现过程是这样:
- 有一个接口A中有一个抽象算法方法a
- 有一组接口A的实现类A-? 用不同具体算法实现了抽象算法方法a
- 在客户端里先持有一个算法接口的引用,在要调用某个算法方法时,你就给这个引用赋实现类的值,然后通过这个引用调用相应算法方法就可以了
- 而模板方法模式
- 有一个抽象类A中有两个方法(暂时忽略钩子方法),抽象算法方法a-abstruct,模板业务方法a-mode(模板方法中使用到了抽象算法方法,所以其实这个模板方法现在还不能正常工作)
- 在客户端里要使用这个类时,继承抽象类,并实现抽象算法方法,然后实例化使用
共同点:
- 目的是一样的,让不同算法实现的业务复用代码
区别:
- 形式看起来就是【策略模式】把【模板方法模式】中的模板方法独立到另一个类中,然后在使用的时候,再跟实现了的算法子类拼接到一起。(使用的时候拼接,用户能知道自己在使用什么模式)
- 【模板方法模式】在使用的时候,不用拼接,因为在继承的时候已经是分开继承的,两个方法本来就在一起,你要用哪组就直接调用哪组就行了。(用的时候直接调用完整方法,用户不知道是什么模式实现的)
一个混淆:
- 有时候策略模式中,实现类A-?中用不同具体算法实现的抽象算法方法a中可能有很多重复代码,这个时候为了复用,就把这些重复代码剥离出去,用的时候再调用,那剥离到哪儿呢,就剥离到接口A中,那这个时候接口A就必须是抽象类A了,在这个时候你会发现,策略模式的抽象类A中也有两个方法,也是一个抽象算法方法和另一个具体方法,看着是不是有点像模板方法模式,但其实完全不同:
- 这里的具体方法并不是模板方法,而是另一个工具方法
- 另外还是有一个业务类B和业务方法b,这个b才是意义上的模板方法
- 表面上看策略模式复杂,其实不然,策略模式就是最最简单的面向接口编程的一个例子,最最简单的多态的一个体现,从这个角度看,其实是非常简单的
优缺点或者说两个方法的适应场景:
- 看了很多,发现很多偏颇或者说一团浆糊的理解,即使是已经工作的程序员,所以我特地辩驳一下
- 大部分人倾向于两者差不多,懒得吐槽了
- 还有人甚至对两种模式的界定都分不清,用不要拘泥于模式来搪塞,然后最后说创新了一种介于两者之间的模式,其实就是这两种中的一种,比较多的其实是使用了抽象类代替接口的策略模式
- 然后还有人认为两者最大的区别是外界对方法修改的访问权限的区别,这个不能说没有,但是这个点几无价值
- 个人体会
- 模板方法适合小项目,因为它的形式最简单,用起来方便,但是它对算法的复用比较不灵活,而且大量的继承会产生大量冗余代码,也加重了系统负担
- 策略模式适合大项目,它形式虽然复杂一些,但是管理规范,对算法的复用也可以非常灵活(尤其是在使用抽象类代替接口时),甚至可以用多重算法嵌套来进一步减少冗余代码,而且由采用类的组合,冗余代码也能减少很多