模板方法模式
不知各位看官有无遇到过一种情况,就是很多方法其实很相似,只是各自业务有点区别,大致上还是一样。
而当我看到模版方法模式的时候眼睛一亮,这个可以完美解决问题。
其实这个模式并不难,简单来讲就是把相同的抽象出来,运用多态的性质完成不同的事情。
看一下大话设计模式里面的代码例子
两个人分别抄同样的卷子,然后考试
class TestPaperA{
public void testQuestionA(){
System.out.println("第一题:XXXXXX");
System.out.println("回答:"+"A");
}
public void testQuestionB(){
System.out.println("第二题:XXXXXX");
System.out.println("回答:"+"C");
}
public void testQuestionC(){
System.out.println("第三题:XXXXXX");
System.out.println("回答:"+"D");
}
}
class TestPaperB{
public void testQuestionA(){
System.out.println("第一题:XXXXXX");
System.out.println("回答:"+"B");
}
public void testQuestionB(){
System.out.println("第二题:XXXXXX");
System.out.println("回答:"+"C");
}
public void testQuestionC(){
System.out.println("第三题:XXXXXX");
System.out.println("回答:"+"D");
}
}
通过调用回答的话答案分别是ACD和BCD。
其实他们中间唯一需要不同的只有回答后面的那个答案,所以我们就可以把同样的地方抽象出来,把不同的地方设一个未知的方法,去让子类实现
//把相同的抽象成抽象类
abstract class TestPaper{
public void testQuestionA(){
System.out.println("第一题:XXXXXX");
//answer()这个方法是未知的,因为每个人答案可能都不同
System.out.println("回答:"+answer1());
}
public void testQuestionB(){
System.out.println("第二题:XXXXXX");
System.out.println("回答:"+answer2());
}
public void testQuestionC(){
System.out.println("第三题:XXXXXX");
System.out.println("回答:"+answer3());
}
//交给子类自己去实现
public abstract String answer1();
public abstract String answer2();
public abstract String answer3();
}
然后我们在让AB两个各子继承答题
class TestPaperA extends TestPaper{
@Override
public String answer1() {
return "A";
}
@Override
public String answer2() {
return "C";
}
@Override
public String answer3() {
return "D";
}
}
class TestPaperB extends TestPaper{
@Override
public String answer1() {
return "B";
}
@Override
public String answer2() {
return "C";
}
@Override
public String answer3() {
return "D";
}
}
这样输出的答案还是ACD和BCD,只不过不用在各自抄一遍题目了。
不难看出模板方法模式就结构就两个组成:
抽象类(AbstractClass ):就是抽象模版,定义并实现一个模版方法。
具体子类(ConcreteClass ) :实现父类定义的一个或多个抽象方法。
UML
最后的话
个人感觉模版方法模式是到现在为止最简单的模式没有之一,主要就是把相同的代码抽出来,并没有太多的结构和思想,简单明了。相信不看大家也都会用,主要是不知道它竟然是一种设计模式。