什么是模板方法模式 定义一个操作中的算法骨架,而将一些步骤延迟到子类中去具体实现。模板方法可以使得子类不改变算法的结构就可以重新定义算法的某些特定步骤。 上面就是给出的比较官方的定义,读起来是有点绕口,不过个人认为定义的是非常的标准和仔细。不信你可以先看看下面的具体代码是怎么实现之后在回过头来品味。你品,你细品~~~ 为什么要使用模板方法模式 学习一个设计模式,我们都会问这么写有什么意义呢?为什么这么写,就是很牛逼的呢?我不这样写咋的啦,我的代码还不是可以直接运行起来。对对对,你说的都对,但是您的代码真的就很好维护了吗,真的就好扩展了吗?不信我举一个下面的例子,看看这是不是你写的那种(●’◡’ 模板方法模式是一种行为设计模式,它允许在定义算法或操作的框架时,将具体步骤推迟到子类中实现。在Java中,这种模式通常通过抽象类来实现,抽象类定义了一个模板方法,这个方法由一系列的基本操作组成,这些操作部分是预先定义好的,部分是留给子类去实现的。模板方法模式的核心思想是封装不变的部分,扩展可变的部分,从而提高代码的复用性和可维护性。 在上述例子中,以炒蛋炒饭为例,无论是皇家厨师还是普通厨师,炒蛋炒饭的过程(算法骨架)基本一致,包括准备鸡蛋、放盐、开火、炒饭、熄火和出锅等步骤。但每个厨师在具体操作如炒饭技巧上有所不同,这就是需要子类去实现的部分。 传统的实现方式是使用条件语句(如if-else)来判断不同厨师的行为,这样的代码虽然能工作,但随着需求的增加,例如增加更多的厨师类型或者烹饪步骤,代码将变得难以维护,核心业务逻辑可能会被大量辅助代码所掩盖。 使用模板方法模式后,我们可以创建一个抽象的`Cook`类,定义好烹饪的通用流程(模板方法),如`cook()`。在这个方法中,调用一系列的抽象方法(如`prepareEgg()`、`prepareSalt()`等)和具体方法。这些抽象方法由子类(如`RoyalChef`和`OrdinaryChef`)来实现各自独特的烹饪技巧。这样,核心业务逻辑被清晰地分离出来,易于理解和维护,同时保持了代码的扩展性,因为只需添加新的子类即可支持新的烹饪风格。 以下是使用模板方法模式改进后的代码示例: ```java public abstract class Cook { protected abstract void prepareEgg(); protected abstract void prepareSalt(); private void fire() { System.out.println("打开灶炉....."); } protected abstract void cooking(); private void closeFire() { System.out.println("关闭灶炉....."); } private void out() { System.out.println("起锅咯...."); } public final void cook() { prepareEgg(); prepareSalt(); fire(); cooking(); closeFire(); out(); } } public class RoyalChef extends Cook { @Override protected void prepareEgg() { System.out.println("皇家厨师---打鸡蛋液..."); } @Override protected void prepareSalt() { System.out.println("皇家厨师---鸡蛋中放盐..."); } @Override protected void cooking() { System.out.println("皇家厨师---油温80°,先下米饭..."); System.out.println("皇家厨师---一分钟后倒入鸡蛋液..."); System.out.println("皇家厨师---翻炒翻炒,再翻炒,撒上一点葱花,隔壁小孩都馋哭了(●'◡'●)"); } } public class OrdinaryChef extends Cook { @Override protected void prepareEgg() { System.out.println("普通厨师---鸡蛋直接下锅..."); } @Override protected void prepareSalt() { System.out.println("普通厨师---随便撒点盐..."); } @Override protected void cooking() { System.out.println("普通厨师---油温冒烟就行,倒入鸡蛋液..."); System.out.println("普通厨师---随意加点米饭..."); System.out.println("普通厨师---随便炒炒,意思意思....(●'◡'●)"); } } ``` 通过这种方式,我们可以看到,核心的烹饪逻辑(模板方法`cook()`)保持不变,而每个厨师的独特步骤则在子类中实现。这样,即使添加更多厨师类型,也不会影响到整体的烹饪流程,同时也方便了代码的扩展和维护。这就是模板方法模式的精髓所在。
- 粉丝: 5
- 资源: 896
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0