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

最简单的模式就是打印了 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肯定就是模板啦。

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