在今天的SC课上,老师提出了这样的一个问题:
这个问题的BCD选项没有疑问,但是针对A选项,Template是否可以为interface,我们可以通过编写代码来进行验证:
public interface OrderProcessTemplate {
//Template method
default void processOrder() {
doSelect();
doPayment();
giftWrap();
doDelivery();
}
void doSelect();
void doPayment();
void giftWrap();
void doDelivery();
}
public class NetOrder implements OrderProcessTemplate {
@Override
public void doSelect() {
System.out.println("Net select.");
}
@Override
public void doPayment() {
System.out.println("Net payment");
}
@Override
public void giftWrap() {
System.out.println("Net gift wrap.");
}
@Override
public void doDelivery() {
System.out.println("Net delivery");
}
}
public class StoreOrder implements OrderProcessTemplate {
@Override
public void doSelect() {
System.out.println("Store select.");
}
@Override
public void doPayment() {
System.out.println("Store payment");
}
@Override
public void giftWrap() {
System.out.println("Store gift wrap.");
}
@Override
public void doDelivery() {
System.out.println("Store delivery");
}
}
以下为Client调用:
public class Client {
public static void main(String[] args) {
OrderProcessTemplate orderProcess1 = new NetOrder();
orderProcess1.processOrder();
OrderProcessTemplate orderProcess2 = new StoreOrder();
orderProcess2.processOrder();
}
}
结果如下:
可以发现,Template Pattern的实现中,我们也可以使用interface构造Template。
Oracle的Java8 Tutorial中有这样的内容:
Default methods enable you to add new functionality to the interfaces of your libraries and ensure binary compatibility with code written for older versions of those interfaces.
据此可知,interface的实现类中会自动地继承default方法。