首页 > 其他分享 >设计模式—模板方法模式(template)

设计模式—模板方法模式(template)

时间:2022-08-29 12:02:09浏览次数:71  
标签:name void Worker System template 设计模式 public 模板 out

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

我们来定义程序员的一天,这是一个抽象类,里面定义一个名字以及单参数的构造器,用于传递不同的职业在一天不同的行为。我们这里定义了四种角色,来展示他们的

一天,分别是程序员,测试,hr,项目经理的一天。我们抽出他们共有的行为,进入公司,离开公司,打开电脑,关闭电脑。唯一的区别在于他们的工作内容不同,这样

我们定义这样的一个模板,将模板类定义为抽象类,让不同的职业去具体实现这些工作的细节。因为他们的行为的模板是一样的,因此可以用final来修饰这些方法,work方法

我们具体去实现。下面我们来看具体的模板方法。

public abstract class Worker {
protected String name;

public Worker(String name) {
this.name = name;
}

public final void workOneDay() {
System.out.println("-------enter company--------");
company_on();
open_computer();
work();
close_computer();
company_off();
System.out.println("-------department company--------");
}

public abstract void work();

public final void company_on() {
System.out.println(name + "进入公司");
}


public final void open_computer() {
System.out.println(name + "打开电脑");
}

public final void close_computer() {
System.out.println(name + "关闭电脑");
}

//钩子
public boolean isNeedPrintDate() {
return false;
}

/**
* 离开公司
*/
public void company_off() {
if (isNeedPrintDate()) {
System.out.print(new Date().toLocaleString() + "-->");
}
System.out.println(name + "离开公司");

}
}

 

我们来看程序员的具体实现public class ITWorker extends Worker {


public ITWorker(String name) {
super(name);
}

@Override
public void work() {
System.out.println(name + "写程序-测bug-fix bug");
}

@Override
public boolean isNeedPrintDate() {
if ("Avecle".equals(name)) {
return true;
}
return false;
}
}


HR的具体实现
public class HRWorker extends Worker{
public HRWorker(String name) {
super(name);
}

@Override
public void work() {
System.out.println(name + "看简历-打电话-接电话");
}
}

测试的具体实现
public class QRWorker extends Worker{
public QRWorker(String name) {
super(name);
}

@Override
public void work() {
System.out.println(name + "写测试用例-提交bug-写测试用例");
}
}

项目经理的具体实现
public class ManagerWorker extends Worker {
public ManagerWorker(String name) {
super(name);
}

@Override
public void work() {
System.out.println(name + "打dota...");
}
}


四个职业的具体实现我们我们写完了,我们来写测试类
public class Test {
//模板方法模式
public static void main(String[] args) {
{
Worker it1 = new ITWorker("Avecle");
it1.workOneDay();
Worker it2 = new ITWorker("老张");
it2.workOneDay();
Worker hr = new HRWorker("迪迪");
hr.workOneDay();
Worker qa = new QRWorker("老李");
qa.workOneDay();
Worker pm = new ManagerWorker("坑货");
pm.workOneDay();
}
}
}
运行结果如下:

 

 

 

 下面看下模版方法模式类图,和我们程序的类图:

 

模板方法相当于定义了一个总体的框架,封装了一些不变的方法属性,将变得部分抽象化,定义为抽象方法,等待具体的实现。在模板方法中我们也可以定义钩子,

超类中可提供默认实现或者空实现,子类可覆盖或者不覆盖,具体根据需求来定。

参考鸿洋,csdn地址为:http://blog.csdn.net/lmj623565791/article/details/26276093

标签:name,void,Worker,System,template,设计模式,public,模板,out
From: https://www.cnblogs.com/smile908/p/16635461.html

相关文章

  • 设计模式-装饰者模式(Decorate)
    首先我们来看一下装饰者模式的UML图 图中各个类的含义不懂没有关系,下面我会用一个形象的例子来一一介绍他们,相信大家看完后肯定就明白了  比如,我们玩了一款游戏,里......
  • 设计模式之(3)——抽象工厂方法模式
    定义:抽象工厂模式简单地讲,就是提供一个超级工厂,围绕这个超级工厂创建其他工厂;抽象工厂模式提供一个创建一些列相关或者相互依赖对象的接口;在此之前我们先来讲一下产品......
  • 学习设计模式和画图
    目录参考参考使用keynote画图https://www.yrunz.com/p/用keynote画出手绘风格的配图/使用plantuml进行设计......
  • 高精度模板
    赌一手今年CSP必考高精。加法:#include<bits/stdc++.h>usingnamespacestd;stringa,b;vector<int>add(vector<int>A,vector<int>B){if(A.size()<......
  • 9.设计模式-原型模式
    1.单例模式1.饿汉式packagecom.serlyf.singleton;/***单例模式-饿汉式*1.构造私有*2.本类创建静态示例*3.getInstance()方法公开*/publicclassSingl......
  • 模板——数据结构
    线段树维护区间最值以及满足最值的个数structSGT{ intmx[N<<2],tg[N<<2],su[N<<2]; #definemid((l+r)>>1) #definelc(u<<1) #definerc((u<<1)|1) voidbld(......
  • 最长上升子序列【模板】
     P1439【模板】最长公共子序列-洛谷|计算机科学教育新生态(luogu.com.cn)n^2的最长上升子序列解法#include<iostream>usingnamespacestd;intdp[1001][100......
  • C++ 之函数模板
    C++之函数模板函数的参数类型不确定,这样就可以使用泛型。//类型参数化C++中称之为泛型编程--模板技术template<classT>//告诉编译器,下面如果出现T不要报错,T是......
  • 1- ? str::tr1、variadic templates、nullptr、auto
    1、str::tr1命名空间其中包括shared_ptr和regex,他们都被搬到str命名空间中了 2、https://isocpp.org/blog/2014/03/compiler-support-for-c11-and-c14可以查看支持的......
  • 设计模式-建造者模式
    //1.定义产品//2.抽象构造者,定义抽象方法//3.具体建造者,生产具体的建造方法//4.指挥者,负责生产具体的产品packagecom.serlyf.builder;//产品publicclassHouse......