「这是我参与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 访问修饰符。
什么时候用接口
请看下面这个装饰模式的例子:
装饰模式动态地给一个对象添加一些额外地职责,就增加功能来说,装饰模式比生成子类更加灵活。这里我们利用 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 的职责合并成一个类。