首先看下两者的定义:
策略模式=>策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数
模板模式=>一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用
就比如发表博文吧,定义接口发表博文
public interface IpublishBlog{
//blog 博文
public boolean publish(Object blog);
}
public abstract class AbsPublishBlog {
private String typeJ = "java";
private double money= 100;
public double hasMoney(Object blog) {
//java博文有奖金发,c++没有
if(blog.getType.equalse(typeJ)){
return money;
} else{
return 0;
}
}
}
//定义实现类java c c++...
public class JpublishBlog extends AbsPublishBlog implements IpublishBlog{
public boolean publish(Object blog){
System.out.println("发表java博文");
double monty = super.hasMonty(blog);
System.out.println("java的才有钱拿啊");
}
}
如上,其实也可以用模板方法来实现,直接把IpublishBlog就是了
如此则可以从java实现方式反推两者之间的区别了
即策略模式以实现接口为主要手段,而模板模式以继承为主要手段。
那么extends和implements的区别是什么?
implements可以多实现啊 extends只能单一继承
1、这也就是说模板模式要求整体流程应该稳定,不然父类修改延伸到子类修改,就让人抓狂了,也不符合设计原则
2、这也就是说策略模式要求整体流程应该一致,不然有一个定义算法A实现类用不到但是又不得不实现就不符合初衷了
1、那么再发散回来,结合发表博文这个例子,如果不但是要发表博文,还要宣传论坛政策并且已有现成的接口IPolicy
那么模板就不合适了,你复写一遍宣传接口?那也不符合设计原则啊。策略就可以很好的实现扩展并且不影响发表博文
2、那么再发散回来,结合发表博文的这个例子,如果模板模式实现的内容彼此没有什么联系,彼此差异很大,子类也是有选择性的实现部分方法,那么策略模式就不合适了。比如此处使用模板模式实现 发表博文,招聘,申精,广告等,总不能JpublishBlog也实现招聘广告等无用内容