模板模式(Template Pattern)

23种软件设计模式完整教程

使用场景:

模板模式通常又叫模板方法模式(Template Method Pattern)是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现、适用于流程标准化的业务场景。

 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法

源码实例:

JDK:AbstractList、MyBatis:BaseExecutor等

优点:

1、封装不变部分,扩展可变部分,符合开闭原则。

 2、行为由父类控制,子类实现。

缺点:

继承本身的缺点、修改父类,子类相应的全要修改。

使用实例:

实例1--课程录制类图:

实例1---课程录制代码:

package com.knowledge.system.software_design_pattern.template_pattern.course_instance;

public abstract class NetworkCourse {
    protected  final void createCourse(){
        this.postPreResource();
        this.creatPPT();
        this.liveVideo();
        this.postNote();
        this.postScoure();
        if(needHomework()){
            checkHomework();
        }
    }
    abstract  void  checkHomework();
    //钩子方法
    protected boolean needHomework(){
        return false;
    }

    final void postPreResource(){
        System.out.println("提交预习资料");
    }
    final void creatPPT(){
        System.out.println("制作PPT");
    }
    final void liveVideo(){
        System.out.println("录制直播视频");
    }
    final void postNote(){
        System.out.println("提交课程笔记");
    }
    final void postScoure(){
        System.out.println("提交源码");
    }
}
package com.knowledge.system.software_design_pattern.template_pattern.course_instance;

public class JavaCourse extends NetworkCourse {
    @Override
    void checkHomework() {
        System.out.println("检查java架构课程课件");
    }
}
package com.knowledge.system.software_design_pattern.template_pattern.course_instance;

public class BigDataCourse extends NetworkCourse {

    private boolean needHomeworkFlag=false;

    public BigDataCourse(boolean needHomeworkFlag) {
        this.needHomeworkFlag = needHomeworkFlag;
    }

    @Override
    void checkHomework() {
        System.out.println("检查大数据的课后作业");
    }

    @Override
    protected boolean needHomework() {
        return this.needHomeworkFlag;
    }
}
package com.knowledge.system.software_design_pattern.template_pattern.course_instance;

import com.knowledge.system.software_design_pattern.template_pattern.course_instance.BigDataCourse;
import com.knowledge.system.software_design_pattern.template_pattern.course_instance.JavaCourse;
import com.knowledge.system.software_design_pattern.template_pattern.course_instance.NetworkCourse;

/**
 * 1.模板模式:定义一个算法的骨 架,并允许子类为一个或者多个步骤提供实现。
 *     1.1  一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
 *     1.2  各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
 * 2.实际例子:JDK  :AbstractList、 Mybatis:BaseExecutor
 */
public class Test {
    public static void main(String[] args) {
        System.out.println("模板模式");
        NetworkCourse javaCourse=new JavaCourse();
        javaCourse.createCourse();

        NetworkCourse bigDataCourse=new BigDataCourse(true);
        bigDataCourse.createCourse();
    }
}

实例2---游戏实例类图:

实例2---游戏实例代码:

package com.knowledge.system.software_design_pattern.template_pattern.myself_instance;

public abstract class Game {

    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    /**
     * final  修饰方法,防止子类修改,父类主要定整个的流程、抽出公共不变的方法,子类实现有差异的方法。
     */
    public final void play(){
        initialize();
        startPlay();
        endPlay();
    }

}
package com.knowledge.system.software_design_pattern.template_pattern.myself_instance;

public class FootBall  extends Game{
    @Override
    void initialize() {
        System.out.println("FootBall  initialize");
    }

    @Override
    void startPlay() {
        System.out.println("FootBall   startPlay");
    }

    @Override
    void endPlay() {
        System.out.println("FootBall  endPlay");
    }
}
package com.knowledge.system.software_design_pattern.template_pattern.myself_instance;

public class BasketBall extends Game{
    @Override
    void initialize() {
        System.out.println("BasketBall  initialize");
    }

    @Override
    void startPlay() {
        System.out.println("BasketBall   startPlay");
    }

    @Override
    void endPlay() {
        System.out.println("BasketBall  endPlay");
    }
}
package com.knowledge.system.software_design_pattern.template_pattern.myself_instance;

public class Test {
    public static void main(String[] args) {
        System.out.println("模板模式测试");
        Game fb=new FootBall();
        fb.play();

        Game gm=new BasketBall();
        gm.play();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值