抽象类实现接口时可以重写接口里部分的方法或者不重写接口中的方法,但是抽象类的子类必须重写接口中没被抽象类实现的方法,设计模式中的建造者模式就用到了这种思想。
比如说我有一个食物条目的接口
package com.设计模式.建造者模式;
/*
* 食物条目的接口
* */
public interface Item {
String name(); //名字
Packing packing(); //打包方式
float price(); //价格
}
然后用抽象的汉堡类接入实现这个接口
package com.设计模式.建造者模式;
/*
* 汉堡的抽象类
* */
public abstract class Burger implements Item{
@Override
public Packing packing() {
return "纸盒包装";
}
//接口也是抽象类,抽象类实现接口可以重写接口里部分的方法或者不重写接口中的方法
}
我们可以看到此时程序此时是不报错的,即符合JAVA语言的语法
用蔬菜汉堡类来继承抽象汉堡类
package com.设计模式.建造者模式;
public class VegBurger extends Burger{
@Override
public String name() {
return "蔬菜汉堡";
}
@Override
public float price() {
return 25f;
}
}
用鸡肉汉堡类继承抽象汉堡类
package com.设计模式.建造者模式;
public class ChickenBurger extends Burger{
@Override
public String name() {
return "鸡肉汉堡";
}
@Override
public float price() {
return 30f;
}
}
这样,我们就把鸡肉汉堡和蔬菜汉堡相同的部分(打包方式)少写的一遍,当有n种汉堡时,就少写了n遍,提高了代码的效率。
同时,他们两个不同的部分(名字和价格)分别在子类中重写,实现了目的功能。