设计模式之模板方法模式

核心

当功能内部一部分实现时确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

1.模板方法模式实现

abstract class Test {

    public final void getTime(){ //模板方法,此功能如果不需要复写,可加 final 限定
        long start = System.currentTimeMillis();
        code(); //不确定的功能部分,提取出来,通过子类实现抽象方法实现
        long end = System.currentTimeMillis();
        System.out.println("毫秒是:"+(end-start));
    }
    public abstract void code(); //抽象不确定的功能,让子类复写实现
}
class Test2 extends Test{
    public void  code(){
        for(int i =0; i < 10; i++){
            System.out.println("y");
        }
    }
}

public class Test3 {
    public static void main(String[] args){
     // TODO 此为main方法
        Test test = new Test2();
        test.getTime();
    }
}

2.日程模板
在模板方法模式中,基本方法包括:抽象方法、具体方法。

abstract class Test {

    public final void schedule(){ //模板方法,此功能如果不需要复写,可加 final 限定
        goOut();
        byMethod(1); //不确定的功能部分,提取出来,通过子类实现抽象方法实现
        work();
        byMethod(0); //不确定的功能部分,提取出来,通过子类实现抽象方法实现
        goHome();

    }
    public void goOut(){//具体方法
        System.out.println("出门");
    }
    public abstract void byMethod(int j); //抽象不确定的功能,让子类复写实现
    public abstract void work();//抽象不确定的功能,让子类复写实现

    public void goHome(){//具体方法
        System.out.println("回家");
    }
}
class Test2 extends Test{
    public void byMethod(int j){
        if(j == 1){
            System.out.println("开车");
        }else {
            System.out.println("走路");
        }
    }
    public void work(){
        System.out.println("工作修改程序bug");
    }
}

public class Test3 {
    public static void main(String[] args){
     // TODO 此为main方法
        Test test = new Test2();
        test.schedule();
    }
}

运行结果:

出门
开车
工作修改程序bug
走路
回家

3.在模板方法模式中,基本方法包括:抽象方法、具体方法和钩子方法,正确使用“钩子方法”可以使得子类控制父类的行为。

abstract class Test {

    public final void schedule(){ //模板方法,此功能如果不需要复写,可加 final 限定
        buyLottery();
        if(checked()){
            System.out.println("查看是否中奖中......");
            result(); //不确定的功能部分,提取出来,通过子类实现抽象方法实现
        }else{
            System.out.println("搞忘去看中奖没有,错失了一个亿。");
            System.out.println();
        }

    }
    public void buyLottery(){//具体方法
        System.out.println("突然心血来潮购买了一注彩票");
    }

    public boolean checked(){//钩子方法
        return true;
    }

    public abstract void result();

}
class Test2 extends Test{
    public boolean checked(){
        return false;
    }
    public void result(){
    }
}

class Test4 extends Test{
    public boolean checked(){
        return true;
    }
    public void result(){
        System.out.println("果然是天选之子,中奖啦。");
        System.out.println();
    }
}


public class Test3 {
    public static void main(String[] args){
     // TODO 此为main方法
        Test test = new Test2();
        test.schedule();

        Test test1 = new Test4();
        test1.schedule();
    }
}

运行结果:

突然心血来潮购买了一注彩票
搞忘去看中奖没有,错失了一个亿。

突然心血来潮购买了一注彩票
查看是否中奖中......
果然是天选之子,中奖啦。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值