【每日一记】设计模式——模板方法模式

23 篇文章 0 订阅
23 篇文章 0 订阅

概述

  • 定义:定义一个操作的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某种特定步骤
  • 试用场景:
    1. 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现
    2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复
    3. 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制

实现

// 抽象类,定义算法骨架
public abstract class BaseTemplate {

    public void use() {
        part1();
        part2();
    }

    public abstract void part1();

    public abstract void part2();
}

// 实现类,实现指定的步骤
class TemplateMethod1 extends BaseTemplate {

    @Override
    public void part1() {
        System.out.println("TemplateMethod1 part1");
    }

    @Override
    public void part2() {
        System.out.println("TemplateMethod1 part2");
    }

}

// 实现类,实现指定的步骤
class TemplateMethod2 extends BaseTemplate {

    @Override
    public void part1() {
        System.out.println("TemplateMethod2 part1");
    }

    @Override
    public void part2() {
        System.out.println("TemplateMethod2 part2");
    }

}
// 客户端
public class Client {
    public static void main(String[] args) throws Exception {
        BaseTemplate t1 = new TemplateMethod1();
        t1.use();
        BaseTemplate t2 = new TemplateMethod2();
        t2.use();
    }
}

实际应用

java.io.InputStream#read()

// 抽象方法,由子类实现
public abstract int read() throws IOException;

// 定义算法骨架,调用抽象方法
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值