java 模板方法模式

java模板方法模式


  • 为什么要用模板方式:
    例如当前有一个需求,实现小黄车(ofo)使用逻辑,我们知道小黄车开锁需要输入密码或者扫码开锁,然后进行骑行。
    我们拿到这个需求第一印象,很简单,首先抽象出一个父类,然后分别实现输入密码开锁以及扫码开锁,具体代码如下:
    public abstract class BicycleAbstract {
    
        protected boolean isNeedUnlock = true;
    
        public abstract void unlock();
    
        public abstract void ride();
    }
    
    public class CodeBicycle extends BicycleAbstract {
        @Override
        public void unlock() {
            if(this.isNeedUnlock){
                System.out.println("---输入密码,开始解锁---");
            }else{
                System.out.println("---车锁已坏,不需要解锁---");
            }
        }
    
        @Override
        public void ride() {
            System.out.println("---" + getClass().getSimpleName() + " 骑起来很拉风---");
        }
    
        public void setIsNeedUnlock(boolean isNeedUnlock){
            this.isNeedUnlock = isNeedUnlock;
        }
    
        public void use(){
            unlock();
            ride();
        }
    }
    
    public class ScanCodeBicycle extends BicycleAbstract{
        @Override
        public void unlock() {
            if(this.isNeedUnlock){
                System.out.println("---扫码解锁,开始解锁---");
            }else{
                System.out.println("---车锁已坏,不需要解锁---");
            }
        }
    
        @Override
        public void ride() {
            System.out.println("---" + getClass().getSimpleName() + " 骑起来很拉风---");
        }
    
        public void isNeedUnlock(boolean isNeedUnlock){
            this.isNeedUnlock = isNeedUnlock;
        }
    
        public void use(){
            unlock();
            ride();
        }
    }
    
    • 测试类:
    public class Main{
        public static void main(String[] args) {
            ScanCodeBicycle scanCodeBicycle = new ScanCodeBicycle();
            scanCodeBicycle.use();
    
            CodeBicycle codeBicycle = new CodeBicycle();
            codeBicycle.use();
        }
    }
    
    • 程序结果如下:
    ---扫码解锁,开始解锁---
    ---ScanCodeBicycle 骑起来很拉风---
    ---输入密码,开始解锁---
    ---CodeBicycle 骑起来很拉风---
    
  • 子类继承父类问题: 我们可以从上面代码分析出,功能是可以实现,但是代码复用很高,好,我们开始优化,优化方法我们使用模板模式进行优化
  • 模板模式,实现小黄车(ofo)需求:
    • 模板模式如何实现:

      • 抽象出一个父类,抽象
    • 代码逻辑如下:

    public abstract class BicycleAbstract {
    
        protected boolean isNeedUnlock = true;
    
        /**
         * 自行车解锁方法
         */
        protected abstract void unlock();
    
        /**
         * 自行车骑行方法
         */
        protected abstract void ride();
    
        public final void use(){
            if(isNeedUnlock){
                unlock();
            }else{
                System.out.println("---车锁已坏,不需要解锁---");
            }
            ride();
        }
    
    }
    
    public class CodeBicycle extends BicycleAbstract {
        @Override
        protected void unlock() {
            System.out.println("---输入密码,开始解锁---");
        }
    
        @Override
        protected void ride() {
            System.out.println("---" +getClass().getSimpleName()+" 骑起来很拉风---");
        }
    
        public void isNeedUnlock(boolean isNeedUnlock) {
            this.isNeedUnlock = isNeedUnlock;
        }
    }
    
    public class ScanCodeBicycle extends BicycleAbstract{
        @Override
        protected void unlock() {
            System.out.println("---手机扫码,开始解锁---");
        }
    
        @Override
        protected void ride() {
            System.out.println("---" + getClass().getSimpleName() + " 骑起来很拉风---");
        }
    
        public void isNeedUnlock(boolean isNeedUnlock) {
            this.isNeedUnlock = isNeedUnlock;
        }
    }
    
    • 测试类:
    public class Main{
        public static void main(String[] args) {
            ScanCodeBicycle scanCodeBicycle = new ScanCodeBicycle();
            scanCodeBicycle.use();
    
            CodeBicycle codeBicycle = new CodeBicycle();
            codeBicycle.use();
        }
    }
    
    • 程序结果如下:
    ---扫码解锁,开始解锁---
    ---ScanCodeBicycle 骑起来很拉风---
    ---输入密码,开始解锁---
    ---CodeBicycle 骑起来很拉风---
    
  • 小结:
    • 什么是模板方式:模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现,模板方法模式可以让子类在不该变算法整体结构的情况下,重新定义算法中某些步骤。这里算法我们可以理解为“业务逻辑”
    • 什么时候使用模板方式:如果子类有一部分相同的业务逻辑,但是具体实现又各不相同,这时就可以考虑使用模板方法模式
    • 如何使用:模板方法定义为final,可避免子类重写,需要子类重写的方法为abstract,可以强迫子类去实现。
    • 优点:复用和扩展。其中复用是指子类复用父类中提供的模板方法代码,扩展指的是,框架通过模板提供的功能扩展点,让框架用户在不修改源码的情况下,基于扩展点定制化框架功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值