如果现在有一个电商网站,用户需要购买购买一件商品,我们需要在用户购买商品前做一些其他的事情,比如记录日志,进行性能统计,权限检查等等。按照面向对象的设计模式,应该把常用的方法抽出来在业务逻辑前后进行调用。这样虽然也可以完成逻辑,但是那些与日志,安全,事务,性能统计的相关代码快把真正的代码淹没了,不仅这个类需要这么干,其他的类也需要这么干,这样会导致重复代码特别多。所以前辈们想出了解决办法--“模板方法”设计模式来解决部分问题
public abstract class BaseCommand { public void excute(){ System.out.println("执行之前的动作"); domain(); System.out.println("执行之后的动作"); } public abstract void domain(); }
public class PlaceOrderCommand extends BaseCommand { @Override public void domain() { System.out.println("下单"); } }
public class Client { public static void main(String[] args) { new PlaceOrderCommand().excute(); } }
在父类(BaseCommadn)中已经把那些乱七八糟的非业务逻辑性代码写好了,只留了一个抽象方法给子类去实现。
优点:子类变得更清爽,只需要关注业务逻辑
缺点:只能被迫接收超类定义好的,要执行哪些,按什么顺序,只能无条件接收。哪怕这个逻辑不需要某个功能也会强迫执行