抽象类模板模式
execute方法定义了模板的执行逻辑,步骤2留给子类实现
public abstract class ExampleTemplate {
public void execute() {
one();
two();
three();
}
protected abstract void two();
private void one() {
System.out.println("one");
}
private void three() {
System.out.println("three");
}
}
public class ExampleTemplateImpl extends ExampleTemplate {
public static void main(String[] args) {
ExampleTemplateImpl exampleTemplate = new ExampleTemplateImpl();
exampleTemplate.execute();
}
@Override
protected void two() {
System.out.println("two");
}
}
接口模板模式
下面是我推荐使用的方式,多用组合,少用继承
public class ExampleTemplate {
public interface Template {
void two();
}
public void execute(Template template) {
one();
template.two();
three();
}
private void one() {
System.out.println("one");
}
private void three() {
System.out.println("three");
}
public static void main(String[] args) {
ExampleTemplate template = new ExampleTemplate();
template.execute(new Template() {
@Override
public void two() {
System.out.println("two");
}
});
}
}
多层级模板模式
分层思想
public interface Template {
void two();
}
public interface Extractor {
void process();
}
public class DefaultExtractor implements Extractor {
private Template template;
public DefaultExtractor(Template template) {
this.template = template;
}
@Override
public void process() {
template.two();
}
}
public class ProxyExtractor implements Extractor {
private Template template;
public ProxyExtractor(Template template) {
this.template = template;
}
@Override
public void process() {
System.out.println("before two");
template.two();
System.out.println("after two");
}
}
public class ExampleTemplate {
public void execute(Extractor extractor) {
one();
extractor.process();
three();
}
public void execute(Template template) {
execute(new DefaultExtractor(template));
}
public void execute2(Template template) {
execute(new ProxyExtractor(template));
}
private void one() {
System.out.println("one");
}
private void three() {
System.out.println("three");
}
public static void main(String[] args) {
ExampleTemplate template = new ExampleTemplate();
Template t = new Template() {
@Override
public void two() {
System.out.println("two");
}
};
template.execute(t);
template.execute2(t);
}
}