Welcome everyone

模板方法模式

设计模式 汪明鑫 650浏览 1评论

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

 

比如在使用JDBC连接时,都是标准的一套流程,如果有很多CURD,我们就要重复写很多代码,在这里就可以使用模板方法模式,把这些固定的流程封装成一个模板方法。

 

举个实际的例子帮助我们更好的理解

 

直接上类图:

 

Game是一个抽象类,LOL是其子类,

Game中就提供了模板方法  play( ),并用final修饰,因此子类不能重写破坏模板方法的逻辑。

当然其他游戏同样可以继承Game类,调用其模板方法。

 

/**
 * @author: wangmingxin1
 * @create: 2018-11-08 15:35
 **/
public abstract class Game {

    //基本方法
    //定义成protected,不让外部类访问,只能子类继承重写
    protected abstract void goBar();            //去网吧
    protected abstract void openComputer();     //上机
    protected abstract void loginGame();        //登录游戏
    protected abstract void start();            //开始打游戏
    protected abstract void drink();            //喝饮料

    //钩子方法(Hook Method)    子类可以重写
    protected boolean isThirsty(){   //我们上网不能一直喝水啊,渴的时候再喝
        //最开始到网吧还不渴,渴了再买水
        return false;
    }

    //按照一定的顺序组织
    //定义成final  子类不能重写这个方法,修改这个规则   直接调用这个方法
    final public void play(){    //这个方法就是传说中的模板方法
        this.goBar();
        this.openComputer();
        this.loginGame();
        this.start();

        if(this.isThirsty()) {
            this.drink();
        }
    }

}
/**
 * 到网吧打英雄联盟
 *
 * @author: wangmingxin1
 * @create: 2018-11-08 15:46
 **/
public class LOL extends Game{

    private boolean thirsty;

    @Override
    protected void goBar() {
        System.out.println("周末去波网吧耍联盟...");
    }

    @Override
    protected void openComputer() {
        System.out.println("老板上机...");
    }

    @Override
    protected void loginGame() {
        System.out.println("游戏登录中...");
    }

    @Override
    protected void start() {
        System.out.println("欢迎进入召唤师峡谷...");
    }

    @Override
    protected void drink() {
       System.out.println("渴了,买瓶可乐喝...");
    }

    @Override
    protected boolean isThirsty() {
        return this.thirsty;
    }

    public void setThirsty(boolean thirsty) {
        this.thirsty = thirsty;
    }
}

 

写主函数测试

/**
 * @author: wangmingxin1
 * @create: 2018-11-08 15:52
 **/
public class Main {
    public static void main(String[] args){
        LOL lol = new LOL();
        lol.setThirsty(true);

        lol.play();
    }

}

 

运行

 

我们要扩展功能时,只需要新写其他的类继承Game类,并实现基本方法中的抽象方法

又可以借助钩子方法实现新的逻辑,比如在本例中使用钩子方法来决定是否调用drink( )方法。

 

模板方法帮助我们封装一个固定的流程,减少代码量,方便功能的扩展。

既统一了主要流程,也提供了很大的灵活性。

父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。

一般模板方法都加上final关键字, 防止子类重写模板方法.

可以提供钩子方法,由子类重写

模板方法模式使用场景: 当要完成在某个过程, 该过程要执行一系列步骤 , 这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理

 

 

转载请注明:汪明鑫的个人博客 » 模板方法模式

喜欢 (0)

说点什么

1 评论 在 "模板方法模式"

提醒
avatar
排序:   最新 | 最旧 | 得票最多
trackback

[…] 之前已经有一篇关于模版方法模式的例子 […]

wpDiscuz