文章目录
  1. 1. 模板方法模式 Template Method
    1. 1.1. 问题:
    2. 1.2. 意图:
    3. 1.3. 代码
  2. 2. 小结

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

模板方法模式 Template Method

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

问题:

  • Two different components have significant similarities, but demonstrate no reuse of common interface or implementation. If a change common to both components becomes necessary, duplicate effort must be expended.

意图:

  • Define the skeleton of an algorithm in an operation, deferring some steps to client subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
  • Base class declares algorithm ‘placeholders’, and derived classes implement the placeholders.

代码

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

代码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

  • 使用频率:
    模板方法运用实在太广,如果使用MVC那么你的V肯定就是模板啦。

  • 利弊影响:
    目前各种各样的模板都非常成熟啦,不会有太大问题,除非自己弄模板引擎。

文章目录
  1. 1. 模板方法模式 Template Method
    1. 1.1. 问题:
    2. 1.2. 意图:
    3. 1.3. 代码
  2. 2. 小结