博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之模板方法模式
阅读量:3915 次
发布时间:2019-05-23

本文共 3236 字,大约阅读时间需要 10 分钟。

定义:模板方法模式(Template Method Pattern)通常又叫模板模式,是指定义一个算法的骨架,并允许子类为其中的一个或者多个步骤提供实现

模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤

属于行为型设计模式

适用场景

1.一次性实现一个算法不变的部分,并将可变的行为留给子类来实现
2.各个类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复

优点

1.利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性.
2.将不同的代码在不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性.
3.把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则

缺点

1.类数目的增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加.
2.类数量的增加,间接地增加了系统实现的复杂度.
3.继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍

例子

一般用法
public abstract class AbstractClass {
protected void step1(){
System.out.println("AbstractClass:step1"); } protected void step2(){
System.out.println("AbstractClass:step2"); } protected void step3(){
System.out.println("AbstractClass:step3"); } public final void templateMethod(){
this.step1(); this.step2(); this.step3(); }}
public class ConcreteClassA extends AbstractClass{
@Override protected void step1() {
System.out.println("ConcreteClassA:step1"); }}
public class ConcreteClassB extends AbstractClass{
@Override protected void step2() {
System.out.println("ConcreteClassB:step2"); }}
public class Test {
public static void main(String[] args) {
AbstractClass abc = new ConcreteClassA(); abc.templateMethod(); abc = new ConcreteClassB(); abc.templateMethod(); }}
简单使用例子
public abstract class AbstractCourse {
public final void createCourse(){
//1.发布预习资料 postPreResource(); //2.制作课件 createPPT(); //3.在线直播 liveVideo(); //4.上传课后资料 postResource(); //5.布置作业 postHomeWork(); //6.是否检查作业 if(needCheckHomeWork()){
checkHomeWork(); } } protected boolean needCheckHomeWork(){
return false;}; protected abstract void checkHomeWork(); protected void postPreResource(){
System.out.println("发布预习资料"); }; protected void createPPT(){
System.out.println("制作课件"); }; protected void liveVideo(){
System.out.println("在线直播"); }; protected void postResource(){
System.out.println("上传课后资料"); }; protected void postHomeWork(){
System.out.println("布置作业"); };}
public class JavaCourse extends AbstractCourse{
private boolean needCheckHomeWork = false; public void setNeedCheckHomeWork(boolean needCheckHomeWork) {
this.needCheckHomeWork = needCheckHomeWork; } @Override protected boolean needCheckHomeWork() {
return this.needCheckHomeWork; } @Override protected void checkHomeWork() {
System.out.println("检查java作业"); }}
public class PyCourse extends AbstractCourse{
@Override protected void checkHomeWork() {
System.out.println("检查python作业"); }}
*/public class Test {
public static void main(String[] args) {
System.out.println("=========java=========="); JavaCourse javaCourse = new JavaCourse(); javaCourse.setNeedCheckHomeWork(true); javaCourse.createCourse(); System.out.println("=========python==========="); PyCourse pyCourse = new PyCourse(); pyCourse.createCourse(); }}

转载地址:http://xkjrn.baihongyu.com/

你可能感兴趣的文章
系统架构中为什么要引入消息中间件?
查看>>
Java内存模型详解
查看>>
Java NIO之Selector
查看>>
SLF4J源码解析(一)
查看>>
Spring AOP用法详解
查看>>
记一位朋友斩获BAT技术专家Offer的面试经历
查看>>
Java并发编程之阻塞队列与Fork/Join框架
查看>>
并发、并行傻傻分不清楚?
查看>>
一个Java程序员该有的良好品质
查看>>
程序员创业之如何获取第一笔风险投资
查看>>
听说小米进入世界500强啦?解读历年500强数据了解国情
查看>>
Maven中央仓库发布历程
查看>>
springBoot的过滤器,监听器,拦截器
查看>>
树状数组入门(简单的原理讲解)
查看>>
程序员的迷茫,迷茫的程序员
查看>>
datawhale课程[动手学数据分析]——Task01:数据加载及探索性数据分析
查看>>
datawhale课程[动手学数据分析]——Task02:数据清洗简述
查看>>
《统计学习方法第二版》学习笔记2——感知机
查看>>
《统计学习方法第二版》学习笔记3——K近邻法
查看>>
MySQL: win10安装MySQL 8.0.21成功记录【转载】
查看>>