从名字上看模板模式与元型模式有点像,但实际上它们有很大的不同。
元型模式是创建系列中的模式,它的实现是先为类创建一个实例,然后对这个实例进行初化,并当成是元型。以后再需要这个类的实例时,不再是从头开始new,而是从已有的元型clone。当然,元型可能不只一个,这个时候就要用集合类进行管理了,在clone之前先去集合里查找匹配的元型。
模板模式是行为系列中的模式。它的实现方式是在抽象类中定义一个主方法,这个主方法定义调用其它方法的顺序、逻辑,它就是模板。其它方法则在不同的扩展类中实现。
模板模式很简单,但是项目开发中会经常遇到。
比如开发一个负荷测试工具,无论测试的目标是什么,连接服务器------>按规定的次数、时间间隔向服务器发送消息------>断开与服务器的连接这种逻辑是不会变的,这种情况下就可以使用模板模式,代码如下:
package com.zhangxf.template;
abstract class MyTest {
public final void startTest(int times, int interval) {
connect();
for (int i = 0; i < times; i++) {
sendMessage();
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
disConnect();
}
public abstract void connect();
public abstract void sendMessage();
public abstract void disConnect();
}
class MyTestMail extends MyTest {
@Override
public void connect() {
System.out.println("Connect to mail server");
}
@Override
public void sendMessage() {
System.out.println("Send message to mail server");
}
@Override
public void disConnect() {
System.out.println("Disconnect with mail server");
}
}
class MyTestWeb extends MyTest {
@Override
public void connect() {
System.out.println("Connect to web server");
}
@Override
public void sendMessage() {
System.out.println("Send message to web server");
}
@Override
public void disConnect() {
System.out.println("Disconnect with web server");
}
}
public class TemplatePattern {
public static void main(String[] args) {
System.out.println("Test for web server");
MyTest test = new MyTestWeb();
test.startTest(10, 5);
System.out.println("Test for mail server");
test = new MyTestMail();
test.startTest(5, 10);
}
}
运行结果:
Connect to web server
Send message to web server
Send message to web server
Send message to web server
Send message to web server
Send message to web server
Send message to web server
Send message to web server
Send message to web server
Send message to web server
Send message to web server
Disconnect with web server
Test for mail server
Connect to mail server
Send message to mail server
Send message to mail server
Send message to mail server
Send message to mail server
Send message to mail server
Disconnect with mail server