每天一个设计模式之(3)-----模板方法模式

1.为什么要使用模板方法模式

    模板方法,就是一个方法是模板,其它的子类只要照着这个方法搞就行了。这样说比较抽象,以一个例子作为说明。比如我有一个AbstractCar,车能启动,能停止,能挂挡,能按喇叭,当然也能跑。那么我们想要车子跑,那么就要先启动它,再挂挡,才能跑,跑的过程中还能按喇叭,跑完了就可以停下来了。那么这个跑就是模板方法,我们只要把跑相关的动作定义成一套模板:

启动----挂挡----停车

就行了,那么不管是奔驰还是宝马还是ofo(ofo大概不用挂挡),按照这一套模板就能跑起来。

 

2.先看波类图

 

3.模板方法的实现

/**
 * 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改
 * 变一个算法的结构即可重定义该算法的某些特定步骤。
 *
 * 行为由父类控制,子类实现
 */
public abstract class AbstractCar {

    //模板模式的基本方法要设计成 protected,不暴露public方法,符合迪米特原则

    //启动
    protected abstract void start();
    //喇叭
    protected abstract void alarm();
    //熄火
    protected abstract void stop();

    //这就是模板方法模式,把相同的能实现的逻辑直接放到抽象类里面去实现
    //相当于这就是一个封装了的模板,子类只需要关心上面的细节,不需要关心怎么调用
    //为了防止子类覆写,要加上final修饰
    public final void run(){
        this.start();
        if(this.isAlarm()){
            this.alarm();
        }
        this.stop();
    }

    //模板方法的扩展
    //钩子方法,默认返回true,子类可以覆写
    protected boolean isAlarm(){
        return true;
    }
}



/**
 * Created by Administrator on 2017/7/3 0003.
 */
public class BenZ extends AbstractCar{

    @Override
    public void start() {
        System.out.println("BenZ start");
    }

    @Override
    public void alarm() {
        System.out.println("BenZ alarm");
    }

    @Override
    public void stop() {
        System.out.println("BenZ stop");
    }

    //覆写父类方法,实现自己的逻辑
    protected boolean isAlarm(){
        return false;
    }
}

    先不要管那个isAlarm()的钩子方法。AbstractCar的run()方法封装了它需要的操作,启动--按喇叭--停止,并且声明为final的,防止子类覆写。而BenZ只需要实现它自己的启动--按喇叭--停止,那么当它调用自己的run的时候,就是它自己的run,因为AbstractCar里面调用的是 this 对象。

    再看isAlarm()钩子方法,有些车不需要按喇叭,有些车需要,那么我们在子类中可以实现自己的逻辑,这就让模板方法模式多了一丝灵活性,这已经属于模板方法模式的扩展使用了。

main方法

/**
 * 模板方法模式
 */
public class Main {

    public static void main(String[] args) {
        AbstractCar car = new BenZ();
        car.run();
    }
}

 

转载于:https://my.oschina.net/u/3582320/blog/1154288

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值