最简单的模式就是打印了 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:邮件的抽象模板
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:具体的模板
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:客户端调用
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肯定就是模板啦。利弊影响:
低
目前各种各样的模板都非常成熟啦,不会有太大问题,除非自己弄模板引擎。