Java 中的标记接口模式:通过空接口定义行为
也称为
- 标记
- 标记接口
标记接口设计模式的意图
Java 中的标记接口模式用于以类型安全的方式传递关于类的元数据。Java 中没有方法声明的接口称为标记接口。它们用于指示实现此类接口的类具有一些特殊行为或功能。
标记接口模式的详细解释以及真实案例
真实案例
考虑一个 Java 图书馆系统,其中某些书籍很稀有,需要特殊的处理程序,例如限制借阅或特定存储条件。类似于标记接口模式,我们可以有一个名为
RareBook
的标记接口。图书馆目录中实现此接口的书籍被标记为需要特殊处理,但与其他书籍相比,它们没有必要具有不同的方法。当图书馆工作人员处理交易或处理存储时,系统会检查书籍是否实现了
RareBook
接口。如果实现了,系统会自动执行规则,例如“不允许借阅超过三天”或“储存在恒温环境中”。这种标记接口的使用有效地传达了特殊要求,而不会改变书籍的管理方式,它只是作为特殊条件的标记。
通俗地说
Java 中的标记接口设计模式使用空接口以类型安全的方式来表示或定义对象的某些属性和行为,而无需特定的方法实现。
维基百科说
标记接口模式是一种计算机科学中的设计模式,用于支持提供关于对象运行时类型信息的语言。它提供了一种将元数据与类关联起来的方法,而语言本身并没有明确支持这种元数据。
要使用此模式,类将实现一个标记接口(也称为标记接口),它是一个空接口,而与该类实例交互的方法将测试该接口是否存在。与典型的接口指定实现类必须支持的功能(以方法声明的形式)不同,标记接口不需要这样做。此类接口的单纯存在就表明了实现类的特定行为。混合接口既可以作为标记,也可以指定所需方法,但如果使用不当可能会令人困惑。
Java 中标记接口模式的编程示例
标记接口设计模式是一种计算机科学中的设计模式,用于支持提供关于对象运行时类型信息的语言。它提供了一种将元数据与类关联起来的方法,而语言本身并没有明确支持这种元数据。
在给定的 Java 代码示例中,Permission 接口充当标记接口。实现此接口的类被标记为具有特殊权限。让我们分解代码以了解此模式是如何实现的。
首先,我们定义 Permission
接口。此接口没有任何方法,因此它是一个标记接口。
public interface Permission {
// This is a marker interface and does not contain any methods
}
接下来,我们有两个类 Guard
和 Thief
,它们代表应用程序中不同类型的角色。Guard
类实现了 Permission
接口,表明此类的对象具有特殊权限。
public class Guard implements Permission {
public void enter() {
// Implementation of enter method
}
}
另一方面,Thief
类没有实现 Permission
接口,表明此类的对象没有特殊权限。
public class Thief {
public void steal() {
// Implementation of steal method
}
public void doNothing() {
// Implementation of doNothing method
}
}
在 App
类中的 main
方法中,我们创建了 Guard
和 Thief
的实例。然后,我们使用 instanceof
运算符来检查这些对象是否实现了 Permission
接口。如果一个对象实现了 Permission
接口,则允许它执行某些操作。否则,它将被禁止执行这些操作。
public class App {
public static void main(String[] args) {
final var logger = LoggerFactory.getLogger(App.class);
var guard = new Guard();
var thief = new Thief();
if (guard instanceof Permission) {
guard.enter();
} else {
logger.info("You have no permission to enter, please leave this area");
}
if (thief instanceof Permission) {
thief.steal();
} else {
thief.doNothing();
}
}
}
这样,标记接口模式允许我们以类型安全的方式将元数据(在本例中为特殊权限)与类关联起来。
何时在 Java 中使用标记接口模式
标记接口适用于您想要对类施加特殊行为或功能,但不希望强制类定义特定方法的情况。此模式通常用于表明一个类符合特定约定,而不需要实现方法。
Java 中标记接口模式的真实应用
- java.io.Serializable:实现此接口的类能够被 Java 运行时序列化。
- java.lang.Cloneable:实现此接口的类可以使用 Java 中的 clone 方法克隆。
标记接口模式的优点和权衡
优点
- 允许在编译时进行类型检查,使开发人员能够使用多态性来编写更简洁、更灵活的代码。
- 允许在不改变其实际行为的情况下向类添加元数据。
权衡
- 会导致代码库中出现空接口,有些人可能认为这种做法不干净或目的不明确。
- 不强制执行任何方法实现,如果处理不当,可能会导致运行时错误。