和抽象有关的 模板方法(好用)

135 阅读2分钟

通过抽象类将一整套流程中的个别方法写成抽象方法,然后用子类对抽象方法进行多种不同的重写。

这么做可以让类中的某个别方法可以根据对象的不同有不同的形式。

例如:银行流程可以分为——拿号,业务办理,评分。

不同人有着不同的业务需要办理,所以我们可以把 业务办理 这个方法抽象化,通过不同的对象重写,例如:取钱,存钱,查询余额等。

当功能内部一部分实现是确定的,如上例的 拿号 和 评分。一部分实现是不确定的,如上例的 业务办理。这时我们可以把不确定的部分暴露出去,让子类去实现。

public class test {
    public static void main(String[] args) {
        PoorPeople p1 = new PoorPeople();
        p1.Process();
        System.out.println("------------------分割线----------------------");
        RichPeople p2 = new RichPeople();
        p2.Process();
    }
}

abstract class Bank {
    public void TakeNumber() {
        System.out.println("取号");
    }

    // 业务办理
    public abstract void HandleBusiness(); // 通过抽象的方法让不确定的流程在不同的对象中有不同的运行模式

    public void Scoring() {
        System.out.println("评分");
    }

    public final void Process() {
        this.TakeNumber();
        this.HandleBusiness();
        this.Scoring();
    }
}

class PoorPeople extends Bank {
    @Override
    public void HandleBusiness() { // 穷人的业务办理的重写
        System.out.println("穷人拿钱");
    }
}

class RichPeople extends Bank { // 富人的业务办理的重写
    @Override
    public void HandleBusiness() {
        System.out.println("富人拿钱");
    }
}

结果:

取号
穷人拿钱
评分
------------------分割线----------------------
取号
富人拿钱
评分

也可以用来测试某个方法的运行时间,例如 计算1000以内的质数

public class test {
    public static void main(String[] args) {
        SubTemplate t = new SubTemplate();
        t.spendTime(); /* time:3 */
    }
}

// 提供某段代码运行的时间
abstract class template {
    public void spendTime() {
        long start = System.currentTimeMillis();
        code();
        long end = System.currentTimeMillis();
        System.out.println("time:" + (end - start));
    }

    public abstract void code(); // 父类的抽象方法
}

class SubTemplate extends template {
    public void code() { // 通过对父类的抽象方法重写测试的部分
        for (int i = 2; i < 1000; i++) {
            boolean isFlag = true;
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    isFlag = false;
                    break;
                }
            }
            if (isFlag) {
                System.out.println(i);
            }
        }
    }
}

总结:我们可以通过抽象方法让流程的某个部分可以通过对象的不同有着不同的效果。也可以用来进行代码的测试。