前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大话设计模式笔记(七)——模版方法模型

大话设计模式笔记(七)——模版方法模型

作者头像
逝兮诚
发布2019-10-30 21:24:40
3370
发布2019-10-30 21:24:40
举报
文章被收录于专栏:代码人生代码人生

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/76549525

第十章 模版方法模型

含义

在父类中定义一个操作的算法骨架,将算法的一些步骤放到子类去实现。模版方法使得子类不改变算法结构的情况下即可重定义算法的特定步骤。

UML

需求:现有试卷一份,通过模版方法模型完成试卷模版和答卷。

UML图

代码

AbstractTempleExampage

public abstractclass AbstractTempleExampage{
    public final void question1(){
        System.out.println("杨过得到后给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是?a.球磨铸铁;b.马口铁;c.高速合金钢;d.碳素纤维。");
        System.out.println("答案:" +answer1());
    }

    public final void question2(){
        System.out.println("杨过、程英、陆无双铲除了情花,造成?a.使这种植物不再害人;b.使一种珍稀物种灭绝;c.破坏了那个生物圈的生态平衡;d.造成该地区沙漠化;");
        System.out.println("答案:" +answer2());
    }

    public final void question3(){
        System.out.println("蓝凤凰的致使华山师徒、桃谷六仙呕吐不止的药酒属于( ) a.生物毒品 b.神经毒品 c.化学毒品 d.基因毒品 e.以上全不对 ");
        System.out.println("答案:" +answer3());
    }

    protected abstract String answer1();

    protected abstract String answer2();

    protected abstract String answer3();
}

ExampageA

public class ExampageA extends AbstractTempleExampage {
    @Override
    protected String answer1() {
        return "a";
    }

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

    @Override
    protected String answer3() {
        return "c";
    }
}

ExampageB

public class ExampageB extends AbstractTempleExampage {
    @Override
    protected String answer1() {
        return "a";
    }

    @Override
    protected String answer2() {
        return "c";
    }

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

总结

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

模版方法模式是很常用的模式,在Java的io中,InputStream类的read()方法就是使用模版方法。

代码节选

public abstract int read() throws IOException;

/** doc */
public int read(byte b[]) throws IOException {
    return read(b, 0, b.length);
}

/** doc */
public int read(byte b[], int off, int len) throws IOException {
    if (b == null) {
        throw new NullPointerException();
    } else if (off < 0 || len < 0 || len > b.length - off) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return 0;
    }

    int c = read();
    if (c == -1) {
        return -1;
    }
    b[off] = (byte)c;

    int i = 1;
    try {
        for (; i < len ; i++) {
            c = read();
            if (c == -1) {
                break;
            }
            b[off + i] = (byte)c;
        }
    } catch (IOException ee) {
    }
    return i;
}

应用场景

当多个子类是解决某一问题,他们的算法结构相同,只有一些某些实现不同时,可以使用模版方法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第十章 模版方法模型
    • 含义
      • 代码
        • 总结
          • 应用场景
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档