接口定义加强
接口最早的主要特点:由抽象方法和全局常量组成
但是如果项目设计不当,那么就可能出很大的问题
举个例子:
如果我定义了一个接口,并且有子类实现了改接口,现已有1000个子类实例对象,
为了项目需求,现在需要在接口中追加一个方法,那么问题就是,子类必须要覆写接口中所有的抽象方法,我的1000个子类怎么办?
我想要是一个一个方法覆写,搞1000遍,太疯狂了!
如何解决?
把要在接口中追加的方法用defalut修饰,变成普通成员方法
但这是一个挽救原则,在开发中不推荐这样
最好的方法:
在接口和子类之间添加一个过渡抽象类
因为抽象类中可以有普通方法,而抽象类的子类可以不覆写普通方法,因此方法可行。在设计中应该这样去设计
使用接口定义标准
USB接口、PCI接口等等都是接口
接口本身就是一个标准
电脑认的是USB这个标准,而不关心这个标准的实现类(键盘、鼠标、小风扇、U盘等等等等)
所以在实际的开发设计的时候,先定义一个标准(USB接口),再去发展其他的类(设备)。
/** USB接口 */
interface IUSB {
public boolean check();
public String work();
}
/** 电脑类*/
class Computer {
/**插入方法,USB接口是否插入*/
public boolean plugin(IUSB iusb) {
if (iusb.check()) {
iusb.work();
}
return true;
}
}
/** 键盘类,实现USB接口 */
class Keyboard implements IUSB {
@Override //覆写方法
public boolean check() {
return true;
}
@Override
public String work() {
return "机械键盘已就绪,可以开始进行打字啦!";
}
}
/**U盘类,实现USB接口*/
class Upan implements IUSB {
@Override
public boolean check() {
return true;
}
@Override
public String work() {
return "U盘已插入,可以开始传输了!";
}
}
public class Main {
public static void main(String[] args) {
Computer computer = new Computer();
// 实例化对象
IUSB keyboard = new Keyboard();
IUSB Upan = new Upan();
if (computer.plugin(keyboard)) {
System.out.println(keyboard.work());
}
if (computer.plugin(Upan)) {
System.out.println(Upan.work());
}
}
}
输出结果:
再来个小例子:
有一个小胖子,非常喜欢吃零食,什么零食都喜欢,所以你只要告诉他有零食,他就不管是什么零食,只要听到零食,就想大开吃戒
因此,我们可以将零食设计成一个接口,用辣条、棒棒糖、口香糖来实现接口
代码如下:
/** 零食接口 */
interface ISnacks{
/** 是否还有零食 */
public boolean presence();
/** 零食的名字 */
public String name();
}
/**人类*/
class Person{
/** 是否要吃零食 */
public boolean eatSnacks(ISnacks iSnacks){
//如果零食存在,就吃零食
if(iSnacks.presence()){
iSnacks.name();
return true;
}
return false;
}
}
/** 辣条类,实现零食接口 */
class Spicy implements ISnacks{
@Override
public boolean presence() {
return true;
}
@Override
public String name() {
return "一包辣条";
}
}
/** 棒棒糖类,实现零食接口 */
class Lollipop implements ISnacks{
@Override
public boolean presence() {
return true;
}
@Override
public String name() {
return "一根棒棒糖";
}
}
/** 口香糖类,实现零食接口 */
class Gum implements ISnacks{
@Override
public boolean presence() {
return true;
}
@Override
public String name() {
return "一个口香糖";
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
//实例化对象
ISnacks gum = new Gum();
ISnacks lollipop = new Lollipop();
ISnacks spicy = new Spicy();
if(person.eatSnacks(gum)){
System.out.print("小胖子正在吃");
System.out.println(gum.name());
}
if(person.eatSnacks(lollipop)){
System.out.print("小胖子正在吃");
System.out.println(lollipop.name());
}
if(person.eatSnacks(gum)){
System.out.print("小胖子正在吃");
System.out.println(spicy.name());
}
}
}
输出结果:
在上面两个例子中,接口和零食就是一种标准
代码编译器:IntelliJ IDEA 2020.02