模板模式

定义:

封装了一个算法步骤,并允许子类为一个或者多个步骤方法提供实现。

uml图示:

其中templateMethod方法为封装好的模板算法步骤,其中abs开头的方法只父类的抽象方法,由子类继承实现,concrete开通的方法只父类实现好了,子类无需关系,hook方法只子类可以预定那些方法执行或者不执行。

代码部分:

public abstract class Template {
    
/**
 * 抽象类定义里一系列算法的步骤,其中
 *  absOp1(); absOp2();是有子类具体实现的
 *  concreteOp1(); concreteOp2();是 有父类实现方法的,子类不能调整
 *  book();是有子类决定是否覆盖
 */
    final public void templateMethod() {
         absOp1();
         absOp2();
         concreteOp1();
         concreteOp2();
         book();
    }

    abstract public void absOp1();

    abstract public void absOp2();

    final public void concreteOp1() {
        System.out.println("this is Template concreteMethod1!");
    };

    final public void concreteOp2() {
        System.out.println("this is Template concreteMethod2!");
    };

    public void book() {
        System.out.println("this is Template bookMethod!");

    }
}

public class ConcreteTemplateA extends Template {

    @Override
    public void absOp1() {
        System.out.println("this is ConcreteTemplateA absOp1!");

    }

    @Override
    public void absOp2() {
        System.out.println("this is ConcreteTemplateA absOp2!");
    }

}

public class ConcreteTemplateB extends Template {

    @Override
    public void absOp1() {
        System.out.println("this is ConcreteTemplateB absOp1!");

    }

    @Override
    public void absOp2() {
        System.out.println("this is ConcreteTemplateB absOp2!");
    }

    public void  book(){
        System.out.println("this is ConcreteTemplateB bookMethod!");
    }
}

public class test {
    public static void main(String[] args) {
        ConcreteTemplateA A=new ConcreteTemplateA();
        ConcreteTemplateB B=new ConcreteTemplateB();
        A.templateMethod();
        B.templateMethod();

    }

}

 

posted @ 2017-05-10 14:11  葡萄树上有葡萄  阅读(163)  评论(0)    收藏  举报