设计模式学习(三)- 模板方法模式

1.模板方法模式表现形式

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

模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。

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

2.模板方法模式UML图

在这里插入图片描述

3.模板方法模式实例

3.1 重复数据类(最高父接口)

package cn.liulin.algorithm.dhdesign.mb;

/**
 * cn.liulin.algorithm.dhdesign.mb$
 * 所有问题的父类
 * @author ll
 * @date 2021-06-07 14:43:17
 **/
public abstract class TestPaper {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void testQuestion1() {
        System.out.println("今天你吃饭了吗?\na.吃了 b没吃");
        System.out.println(this.name + "答案:" + answer1());
    }

    public void testQuestion2() {
        System.out.println("今天你打游戏了吗?\na.打了 b没打");
        System.out.println(this.name + "答案:" + answer2());
    }

    public void testQuestion3() {
        System.out.println("今天你游泳了吗?\na.游了 b没游");
        System.out.println(this.name + "答案:" + answer3());
    }

    public abstract String answer1();

    public abstract String answer2();
    
    public abstract String answer3();

}

3.2 路人A回答

package cn.liulin.algorithm.dhdesign.mb;

/**
 * cn.liulin.algorithm.dhdesign.mb$
 *
 * @author ll
 * @date 2021-06-07 14:47:27
 **/
public class TestPaperA extends TestPaper{
    @Override
    public String answer1() {
        return "a";
    }

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

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

3.3 路人B回答

package cn.liulin.algorithm.dhdesign.mb;

/**
 * cn.liulin.algorithm.dhdesign.mb$
 *
 * @author ll
 * @date 2021-06-07 14:47:59
 **/
public class TestPaperB extends TestPaper{
    @Override
    public String answer1() {
        return "b";
    }

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

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

3.4 执行

package cn.liulin.algorithm.dhdesign.mb;

/**
 * cn.liulin.algorithm.dhdesign.mb$
 *
 * @author ll
 * @date 2021-06-07 14:48:30
 **/
public class Main {
    public static void main(String[] args) {
        TestPaper testPaperA = new TestPaperA();
        testPaperA.setName("路人A");
        testPaperA.testQuestion1();
        testPaperA.testQuestion2();
        testPaperA.testQuestion3();

        TestPaper testPaperB = new TestPaperB();
        testPaperB.setName("路人B");
        testPaperB.testQuestion1();
        testPaperB.testQuestion2();
        testPaperB.testQuestion3();
    }
}

3.5 执行结果

今天你吃饭了吗?
a.吃了 b没吃
路人A答案:a
今天你打游戏了吗?
a.打了 b没打
路人A答案:b
今天你游泳了吗?
a.游了 b没游
路人A答案:b
今天你吃饭了吗?
a.吃了 b没吃
路人B答案:b
今天你打游戏了吗?
a.打了 b没打
路人B答案:a
今天你游泳了吗?
a.游了 b没游
路人B答案:a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值