设计思想学习—模版方法模式

模板方法模式

不知各位看官有无遇到过一种情况,就是很多方法其实很相似,只是各自业务有点区别,大致上还是一样。

而当我看到模版方法模式的时候眼睛一亮,这个可以完美解决问题。

其实这个模式并不难,简单来讲就是把相同的抽象出来,运用多态的性质完成不同的事情。

看一下大话设计模式里面的代码例子

两个人分别抄同样的卷子,然后考试

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
设计思想学习—模版方法模式_第1张图片

最后的话
个人感觉模版方法模式是到现在为止最简单的模式没有之一,主要就是把相同的代码抽出来,并没有太多的结构和思想,简单明了。相信不看大家也都会用,主要是不知道它竟然是一种设计模式。

你可能感兴趣的:(学习笔记)