前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之模板方法模式

设计模式之模板方法模式

作者头像
低调小熊猫
发布2020-06-07 09:59:04
3560
发布2020-06-07 09:59:04
举报
文章被收录于专栏:低调小熊猫低调小熊猫

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

本教程将通过 Java 实例,一步一步向您讲解设计模式的概念。

模板方法模式

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

我们先炒两个菜

代码语言:javascript
复制
/** * 炒个西红柿 * @author aodeng-低调小熊猫 * @since 19-7-18 */public class CookXihongshi {    public void open(){        System.out.println("打开抽油烟机");    }    public void fire(){        System.out.println("生火");    }    public void doCook(){        System.out.println("西红柿炒蛋");    }    public void outfire(){        System.out.println("灭火");    }    public void close(){        System.out.println("关闭抽油烟机");    }    public void cook(){        this.open();        this.fire();        this.doCook();        this.outfire();        this.close();    }}
代码语言:javascript
复制
/** * 炒个青菜 * @author aodeng-低调小熊猫 * @since 19-7-18 */public class CookVegetable {    public void open(){        System.out.println("打开抽油烟机");    }    public void fire(){        System.out.println("生火");    }    public void doCook(){        System.out.println("炒青菜");    }    public void outfire(){        System.out.println("灭火");    }    public void close(){        System.out.println("关闭抽油烟机");    }    public void cook(){        this.open();        this.fire();        this.doCook();        this.outfire();        this.close();    }}

炒青菜的类和上面西红柿炒蛋的类一比较,你会发现除了 doCook() 方法中具体的实现不一样之外,其他步骤都是完全一模一样的。解决办法很简单,将重复代码抽出来让父类去实现,而西红柿炒蛋和炒青菜都继承它,这样就避免了重复代码:

使用

代码语言:javascript
复制
/** * 抽象父类 两个地方是关键,一是 doCook() 使用 abstract 修饰,让子类去实现。二是 cook() 方法使用 final 关键字修饰,防止子类重写,从而破坏了模板中规定好的流程。 * @author aodeng-低调小熊猫 * @since 19-7-18 */public abstract class Cook {    public void open(){        System.out.println("打开抽油烟机");    }    public void fire(){        System.out.println("生火");    }    /**     * 期望子类去实现     */    public abstract void doCook();    public void outfire(){        System.out.println("灭火");    }    public void close(){        System.out.println("关闭抽油烟机");    }    /**     * 使用final关键字,防止子类重写     */    public final void cook(){        this.open();        this.fire();        this.doCook();        this.outfire();        this.close();    }}
代码语言:javascript
复制
/** * 子类重写 实现要炒的菜 西红柿炒蛋 * @author aodeng-低调小熊猫 * @since 19-7-18 */public class CookXihongshi2 extends Cook {    @Override    public void doCook() {        System.out.println("西红柿炒蛋");    }}
代码语言:javascript
复制
/** * 子类重写 实现要炒的菜 炒青菜 * @author aodeng-低调小熊猫 * @since 19-7-18 */public class CookVegetable2 extends Cook {    @Override    public void doCook() {        System.out.println("炒青菜");    }}

测试

代码语言:javascript
复制
        System.out.println("Hello World!");        Cook cook = new CookXihongshi2();        cook.cook();        Cook cook1=new CookVegetable2();        cook1.cook();        /* ===== 控制台输出Hello World!打开抽油烟机生火西红柿炒蛋灭火关闭抽油烟机打开抽油烟机生火炒青菜灭火关闭抽油烟机*/

看到这里,没错,你已经学会了模板方法模式。模板方法是设计模式中较好理解的一种,它的使用场景是:当有一个业务有 N 个步骤( 模板 ),其中一部分步骤是永恒不变的,那么就将不变的这些步骤抽象到父类中,可能变化的步骤留给子类去实现。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 低调小熊猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模板方法模式
  • 使用
  • 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档