博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式学习--模板方法模式

Posted on 2017-10-13 14:34  南国木棉  阅读(117)  评论(0编辑  收藏  举报

模板方法模式(TemplateMethod):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个

算法的结构即可重新定义该算法的某些特定步骤。

模板方法模式结构图:

案例展示:老师讲试题抄写在黑板上,每个学生在答题卡上写上答案,

1:创建一个试题的超类。

package TemplateMethod;

/**
 * 试卷类
 * @author 我不是张英俊
 *
 */
public abstract  class TestPaper {

    public void testQuestion1(){
        System.out.println("先有鸡还是先有蛋()");
        System.out.println("A:鸡        B:蛋        C:A and B        D:以上答案都错误");
    }
    
    public void testQuestion2(){
        System.out.println("铁锈的主要成分是()");
        System.out.println("A:C元素    B:Al元素    C:Fe元素        D:O元素");
    }
    
    public void testQuestion3(){
        System.out.println("马是怎么睡觉的()");
        System.out.println("A:躺着    B:趴着    C:坐着    D:站着");
    }
    
    public abstract  String answer1();
    public abstract  String answer2();
    public abstract  String answer3();
}

2:学生1的答题纸。

package TemplateMethod;

public class Student1 extends TestPaper{

    @Override
    public String answer1() {
        // TODO Auto-generated method stub
        return "A";
    }

    @Override
    public String answer2() {
        // TODO Auto-generated method stub
        return "B";
    }

    @Override
    public String answer3() {
        // TODO Auto-generated method stub
        return "C";
    }

    
}

3:学生2的答题纸

package TemplateMethod;

public class Student2 extends TestPaper {

    @Override
    public String answer1() {
        // TODO Auto-generated method stub
        return "C";
    }

    @Override
    public String answer2() {
        // TODO Auto-generated method stub
        return "B";
    }

    @Override
    public String answer3() {
        // TODO Auto-generated method stub
        return "A";
    }

}

4:测试类.

package TemplateMethod;

/**
 * 需求:考试抄试卷,
 * 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类
 * 可以不改变一个算法的解耦股即可重新定义该算法的某些特定步骤。
 * @author 我不是张英俊
 *
 */
public class Test {

    public static void main(String[] args) {
        //可以理解为:老师将试题抄在黑板上,然后大家看,在纸上写上各自的答案
        //然后将各自的纸交给老师。
        
        TestPaper s1=new Student1 ();
        System.out.println("学生1交的答题卡");
        System.out.println(s1.answer1());
        System.out.println(s1.answer2());
        System.out.println(s1.answer3());
        
        TestPaper s2=new Student2();
        System.out.println("学生2交的答题卡");
        System.out.println(s2.answer1());
        System.out.println(s2.answer2());
        System.out.println(s2.answer3());
    }

}

5:控制台

学生1交的答题卡
A
B
C
学生2交的答题卡
C
B
A

总结:模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用的平台。

当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为在子类中重复的出现,我们通过模板方法模式把这些行为搬移到单一的地方,

这样就帮互助子类摆脱重复的不变行为的纠缠。

缺点是每个不同的实现都必须写一个子类,增加了子类的数量,但是此种设计就更符合单一职责原则,提高了内聚