高频设计模式:Template Method(模板方法)模式

Template Method简介

父类中定义处理流程的框架,在子类实现具体处理的模式就称为 Template Method模式。

TemplateMethod的类图如下
在这里插入图片描述
其中AbstractClass是抽象类,ConcteteClass是继承该抽象类的子类。

  • AbstractClass中
    method1、method2、method3是抽象方法,没有具体的实现;
    templateMethod是使用final修饰的普通方法,具体实现调用抽象方法。

  • ConcreteClass中
    method1、method2、method3是对抽象类的抽象方法的重写,有具体的实现。

  • Main方法
    通过使用AbstractClass abstractClass = new ConcreteClass(args);,再调用abstractClass的templateMethod模板方法。

示例程序

此程序是一段将字符和字符串循环显示4次的简单程序。
类的一览表

名字说明
AbstractDisplay只实现了display方法的抽象类
CharDisplay实现了open、print、close方法的类
StringDisplay实现了open、print、close方法的类
Main测试程序行为的类

示例程序的类图
在这里插入图片描述
在AbstractDisplay类中定义了display方法,而且在该方法中依次调用了open、print、close这三个抽象方法。在CharDisplay和StringDisplay中有这三个抽象方法的具体实现。

AbstractDisplay 类

AbstractDisplay类有4个方法,分别是 display、open、print、close。其中只有 display方法实现了,open、print、close都是抽象方法。通过查看AbstractDisplay类中 display方法的代码,我们可以知道 display方法进行了以下处理。

  • 调用 open 方法
  • 调用四次 print 方法
  • 调用 close 方法

AbstractDisplay.java

public abstract class AbstractDisplay {
	// 抽象方法
	public abstract void open();
	public abstract void print();
	public abstract void close();
	
	// 模板方法
	public final void display() {
		open();
		for (int i = 0; i < 4; i++) {
			print();
		}
		close();
	}
}

CharDisplay 类

CharDisplay继承了抽象类AbstractDisplay,实现open、print、close方法,三个方法的处理如下表所示

方法名处理
open显示字符串 “<<”
print显示构造函数接收的一个字符
close显示字符串 “>>”

这样,当 display方法被调用时,假设我们向 CharDisplay的构造函数中传递的参数是 H 这个字符,那么最终显示出来的会是如下结果。
<<HHHH>>

CharDisplay.java

public class CharDisplay extends AbstractDisplay {
	
	private char ch;
	public CharDisplay(char ch) {
		this.ch = ch;
	}

	@Override
	public void open() {
		System.out.print("<<");
	}

	@Override
	public void print() {
		System.out.print(ch);
	}

	@Override
	public void close() {
		System.out.println(">>");
	}

}

StringDisplay 类

与CharDispaly类一样,StringDispaly类也实现了open、print、close方法,三个方法的处理如下表所示

方法名处理
open显示字符串 “+ ---- +”
print在构造函数接收的字符串前后分别加上 “|” 并显示出来
close显示字符串 “+ ---- +”

此时,如果 dipslay方法被调用,假设我们向 CharDisplay的构造函数中传递的参是 “Hello World” 这个字符串,那么最终结果会像下面这样,文字会被显示在方框内部。

+-----------+
|Hello World|
|Hello World|
|Hello World|
|Hello World|
+-----------+

StringDisplay.java

public class StringDisplay extends AbstractDisplay {

	private String str;
	
	public StringDisplay(String str) {
		this.str = str;
	}
	
	@Override
	public void open() {
		printLine();
	}

	@Override
	public void print() {
		System.out.println("|" + str + "|");
	}

	@Override
	public void close() {
		printLine();
	}
	
	private void printLine() {
		int width = str.getBytes().length;
		System.out.print("+");
		for (int i = 0; i < width; i++) {
			System.out.print("-");
		}
		System.out.println("+");
	}	
}

Main类

Main类的作用是测试程序行为。在该类中生成了 CharDisplay类和StringDisplay类的实例,并调用了 display方法。
Main.java

public class Main {
	
	public static void main(String[] args) {
		AbstractDisplay d1 = new CharDisplay('H');
		AbstractDisplay d2 = new StringDisplay("Hello World");
		d1.display();
		d2.display();
	}

}

运行结果

<<HHHH>>
+-----------+
|Hello World|
|Hello World|
|Hello World|
|Hello World|
+-----------+
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值