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

最简单的模式就是打印了 print("%s",str);

模板方法模式 Template Method

模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

问题:

意图:

代码

例:比如我们常给用户发送邮件,每个邮件都包含标题和内容,我们可以把每种邮件当成一个模块,设置标题-设置内容,然后发送

代码1:邮件的抽象模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public abstract class MailTemple {
//邮件标题
protected String subject;
//邮件内容
protected String context;
public String getSubject() {
return subject;
}
public String getContext() {
return context;
}
//具体的内容要由具体模板去设置
protected abstract void setSubject(String... args);
protected abstract void setContext(String... args);

public void pushData(String... args){
this.setSubject(args);
this.setContext(args);
}
}

代码2:具体的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ActiveUser extends MailTemple{

@Override
protected void setSubject(String... args) {
this.subject = "亲爱的"+args[0]+",感谢注册,请先激活帐户";
}

@Override
protected void setContext(String... args) {
this.context = "亲爱的"+args[0]+"你的激活代码为"+ args[1]+"请于"+args[2]+"内完成激活";
}

}

public class ForgetPass extends MailTemple{

@Override
protected void setSubject(String... args) {
this.subject = "亲爱的"+args[0]+",请按以下操作找回密码";
}

@Override
protected void setContext(String... args) {
this.context = "亲爱的"+args[0]+"你的找回密码代码为"+ args[1];
}

}

代码3:客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Client {
private static void sendMail(MailTemple temple){
System.out.println(temple.getSubject());
System.out.println(temple.getContext());
}

public static void main(String[] args){
MailTemple temp1 = new ActiveUser();
temp1.pushData("超级VIP","123456","24小时");
sendMail(temp1);

MailTemple temp2 = new ForgetPass();
temp2.pushData("SB用户","654321");
sendMail(temp2);
}
}

小结

模板方法模式 Template Method