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,可以强迫子类去实现。
- 优点:复用和扩展。其中复用是指子类复用父类中提供的模板方法代码,扩展指的是,框架通过模板提供的功能扩展点,让框架用户在不修改源码的情况下,基于扩展点定制化框架功能。