定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
public abstract class SoyaMilk {
// 通过final可选择是否让子类继承
public final void complete(){
select();
add();
soak();
System.out.println("4.制作完成......");
}
private void select(){
System.out.println("1.选择新鲜的黄豆......");
}
// 空实现,类似接口适配器默认方法,子类选择重写,这个方法称为钩子方法
public void add(){
}
private void soak(){
System.out.println("3.浸泡......");
}
public abstract void pack();
}
public class BlackBeanSoyaMilk extends SoyaMilk{
@Override
public void add() {
System.out.println("2.添加黑豆......");
}
@Override
public void pack() {
System.out.println("4.打包黑豆浆......");
}
}
public class PureSoyaMilk extends SoyaMilk{
@Override
public void pack() {
System.out.println("4.打包纯豆浆......");
}
}
测试类
public class Test {
public static void main(String[] args) {
SoyaMilk blackBeanSoyaMilk = new BlackBeanSoyaMilk();
blackBeanSoyaMilk.complete();
System.out.println("=======================================");
SoyaMilk pureSoyaMilk = new PureSoyaMilk();
pureSoyaMilk.complete();
}
}
结果