模板方法模式

《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
目录:设计模式
Github地址:DesignPattern

说明

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

UML图:

这里写图片描述

代码实现:

AbstractClass是抽象类,其实也就是一抽象模版,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。

abstract class AbstractClass{
    public abstract void PrimitiveOperation1();
    public abstract void PrimitiveOperation2();

    public void TemplateMethod(){
        PrimitiveOperation1();
        PrimitiveOperation2();
        System.out.println("------");
    }
}

ConcreteClass,实现父类所定义的一个或多个抽象方法。

class ConcreteClassA extends AbstractClass{

    @Override
    public void PrimitiveOperation1() {
        System.out.println("具体类A实现1方法");
    }

    @Override
    public void PrimitiveOperation2() {
        System.out.println("具体类A实现2方法");
    }
}

class ConcreteClassB extends AbstractClass{

    @Override
    public void PrimitiveOperation1() {
        System.out.println("具体类B实现1方法");
    }

    @Override
    public void PrimitiveOperation2() {
        System.out.println("具体类B实现2方法");
    }
}

客户端调用

public class TemplateMethodPattern {
    public static void main(String[] args){
        AbstractClass c;
        c = new ConcreteClassA();
        c.TemplateMethod();

        c = new ConcreteClassB();
        c.TemplateMethod();

    }
}

运行结果

具体类A实现1方法
具体类A实现2方法
------
具体类B实现1方法
具体类B实现2方法
------

示例

例子:小时候数学随堂测验都是老师在黑板上抄题目,然后学生先抄题目,再做答案。用程序实现这个过程。

UML图:

这里写图片描述

代码实现:

黑板上的试卷-金庸小说考题试卷

public abstract class TestPaper {

    public void TestQuestion1(){
        System.out.println("第1题");
        System.out.println("答案"+Answer1());
    }

    public abstract String Answer1();

    public void TestQuestion2(){
        System.out.println("第2题");
        System.out.println("答案"+Answer2());
    }

    public abstract String Answer2();

    public void TestQuestion3(){
        System.out.println("第3题");
        System.out.println("答案"+Answer3());
    }

    public abstract String Answer3();
}

学生甲抄的试卷

public class TestPaperA extends TestPaper {
    @Override
    public String Answer1() {
        return "b";
    }

    @Override
    public String Answer2() {
        return "c";
    }

    @Override
    public String Answer3() {
        return "d";
    }
}

学生乙抄的试卷

public class TestPaperB extends TestPaper {
    @Override
    public String Answer1() {
        return "c";
    }

    @Override
    public String Answer2() {
        return "b";
    }

    @Override
    public String Answer3() {
        return "a";
    }
}

客户端调用

public class Main {
    public static void main(String[] args){
        System.out.println("学生甲抄的试卷:");

        TestPaper studentA = new TestPaperA();
        studentA.TestQuestion1();
        studentA.TestQuestion2();
        studentA.TestQuestion3();

        System.out.println("学生乙抄的试卷:");
        TestPaper studentB = new TestPaperB();
        studentB.TestQuestion1();
        studentB.TestQuestion2();
        studentB.TestQuestion3();
    }
}

运行结果

学生甲抄的试卷:
第1题
答案b
第2题
答案c
第3题
答案d
学生乙抄的试卷:
第1题
答案c
第2题
答案b
第3题
答案a

模板方法模式特点

模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值