一:模板模式定义
1.1 定义
模板模式是定义一个操作中基本的骨架,而将一些实现步骤延迟到子类中去实现,但是处理的流程还是看父类定制的方式,只是不同的子类执行会得到不同的结果而已,模板模式完全遵循了抽象类应该尽可能将数据实现放在子类当中。
1.2 角色
1:抽象参与者,即模板模式的抽象基类,整个流程实现由其控制,变化的部分由子类实现。
2:具体实现者,即继承抽象参与者的子类,里面有不同的实现
1.3 使用场景
如果一个系统中需要实现一个算法不变的部分,并将变化的部分交给子类去完成,这个时候就可以使用模板模式进行设计。
二:模板模式实现
2.1 抽象基类,定义整个实现的骨干
package com.travelsky.pss.tanjie.model; /** * 模板方法模式:抽象类实现整个骨架,关键步骤的实现依据不同子类实现去实现,大的结构不变 * @author tanjie * * 使用场景: * 1:如果各个子类中有公共的行为时,应该被提取出来集中到一个公共的父类中实现避免代码重复 * 2:在整个软件设计的过程中,如果实现的关键几步中有不变的,有变化的,可将变化的抽象出来供不同的 * 具体子类去实现,父类控制子类的处理逻辑 * * 和策略模式的区别: * * * 策略模式是切换了整个具体的算法实现,不同策略虽然实现的目的一样,但可能具体过程不一样,一旦切换,整个实现过程都会切换 * 模板模式只是实现了父类一些变化的部分,但是整体的骨架还是由抽象基类决定 * */ public abstract class AbstractPeopleWork { public void getUp(){ System.out.println("首先:起床"); } protected abstract void eat(); protected abstract void takeToWork(); public void beginWork(){ System.out.println("最后:开始上班"); } //模板方法,定义final不让子类去修改实现整体的骨架 public final void ModelWork(){ System.out.println("开始调用模板方法"); getUp(); eat(); takeToWork(); beginWork(); System.out.println("模板方法调用结束"); } }
2.2 子类实现
package com.travelsky.pss.tanjie.model; public class PeopleA extends AbstractPeopleWork{ @Override public void eat() { System.out.println("A:吃豆浆油条"); } @Override public void takeToWork() { System.out.println("A:坐公交"); } }
package com.travelsky.pss.tanjie.model; public class PeopleB extends AbstractPeopleWork{ @Override public void eat() { System.out.println("B:吃包子稀饭"); } @Override public void takeToWork() { System.out.println("B:坐地铁"); } }
2.3 测试类
package com.travelsky.pss.tanjie.model; public class ModelMain { public static void main(String[] args) { AbstractPeopleWork abstractPeopleWork = new PeopleA(); AbstractPeopleWork abstractPeopleWork2 = new PeopleB(); abstractPeopleWork.ModelWork(); abstractPeopleWork2.ModelWork(); } }
2.4 实现效果
开始调用模板方法 首先:起床 A:吃豆浆油条 A:坐公交 最后:开始上班 模板方法调用结束 开始调用模板方法 首先:起床 B:吃包子稀饭 B:坐地铁 最后:开始上班 模板方法调用结束