Java (13)接口

176 阅读2分钟

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

Java 接口

根据设计,抽象方法指定一个契约(通过方法名、参数和返回类型)但未提供可重用的代码。当在抽象类的一个子类中实现行为的方式与另一个子类中不同时,抽象方法(在抽象类上定义)就会很有用。

当在应用程序中需要一组可分组到一起的常见行为(例如 java.util.List),但它们存在两个或多个实现时,可以考虑使用接口 定义该行为。

接口 像是包含抽象方法的抽象类;它们定义契约,而不定义实现。

定义接口

接口声明看起来像类声明,但使用了 interface 关键字:

public interface InterfaceName {
    returnType methodName(argumentList);
}

接口中定义的方法没有方法主体。接口的实现者负责提供方法主体(与抽象方法一样)。

实现接口

要在类上定义一个接口,则需要实现 该接口,这意味着提供一个方法主体来进一步提供履行接口契约的行为。

可以使用 implements 关键字实现接口:

public class Manager extends Employee implements BonusEligible, StockOptionRecipient {
  // And so on
}

implements 操作类似 继承用的 extends,接口是使用 implements 关键字,二者不同的是,接口可以有好多个,但继承只能有一个。

然后,我们要在 implements 了接口的类里实现该接口:

public class Manager extends Employee implements StockOptionRecipient {
  public Manager() {
  }
  public void processStockOptions (int numberOfOptions, BigDecimal price) {
    log.info("I can't believe I got " + number + " options at $" +
    price.toPlainString() + "!"); 
  }
}

实现该接口时,需要提供该接口上的一个或多个方法的行为。注意实现的方法必须与接口中的匹配(名称、参数、返回值),还需要添加 public 访问修饰符。

什么时候用接口

请看下面这个装饰模式的例子:

68747470733a2f2f747661312e73696e61696d672e636e2f6c617267652f30303753385a496c6c7931676a6a36357a666963796a33307834306d617766762e6a7067.jpeg

装饰模式动态地给一个对象添加一些额外地职责,就增加功能来说,装饰模式比生成子类更加灵活。这里我们利用 setComponent 来对对象进行包装,每个装饰对象只关系自己的功能,不需要关心如何被添加到对象链当中。

我们把 Decorator 实现如下:

public abstract class Decorator implements Component {
    protected Component component;

    public void setComponent(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        if (component != null) {
            component.operation();
        }
    }
}

如果只有一个 ConcreteComponent 类,而没有抽象的 Component,那么 Decorator 类可以是 ConcreteComponent 的一个子类。

同样,如果只有一个 ConcreteDecorator,那就没必要建立一个单独的 Decorator 类,而可以把 Decorator 和 ConcreteDecorator 的职责合并成一个类。