MENU

接口加强

• November 18, 2020 • 面向对象编程

接口定义加强

接口最早的主要特点:由抽象方法和全局常量组成

但是如果项目设计不当,那么就可能出很大的问题

举个例子:

如果我定义了一个接口,并且有子类实现了改接口,现已有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

Archives QR Code Tip
QR Code for this page
Tipping QR Code