Java 的 "Scanner" 方法与 Facade GoF 设计模式

Java's "Scanner" Method vs. Facade GoF Design Pattern

我正在学习设计模式以提高我的编程技能。现在,我正在探索门面设计模式。

我自己可能会感到困惑,但是,举个例子:Scanner 不是门面吗? 请注意,我不是在问什么是 Facade,而是在尝试确定 Scanner 是否是。

好吧,我声明它是为了让我可以使用某些功能而不用接触复杂更深层次的功能,对吧?

我声明

Scanner sc = new Scanner(System.in);

所以我可以:

String x = sc.nextLine();

这是 class 的一个很好的例子,它简化了 API 并使其清晰且更接近于用途。当我们想在控制台应用程序中从用户读取数据时 InputStream 将很难使用。让我们看一下 Facade 模式的一些定义并与 Scanner class 匹配:

意图

  • 为子系统中的一组接口提供一个统一的接口。 Facade 定义了一个更高级的接口,使子系统 更易于使用。
  • 用更简单的接口包装复杂的子系统。

Scanner class 符合以上两点。

检查清单

  1. 为子系统确定一个更简单、统一的接口或 组件。
  2. 设计一个封装子系统的'wrapper'class。
  3. facade/wrapper 抓住了 组件,并委托给适当的方法。
  4. 客户端仅使用(耦合到)Facade。
  5. 考虑额外的立面是否会增加价值。

Scanner class 匹配以上所有点。因此,我们可以将 Scanner 视为 InputStream.

的外观

Facade 将一对多关系合并为其客户的一对一关系。它们变得更简单,因为它们依赖于一个(高级)Facade 而不是许多(低级)独立组件。 Facade 本身接管了许多低级依赖项(并委托给它们)。

Scanner 与其 Readable source 的关系是普通的旧对象组合。没有合并依赖项。虽然 Scanner 确实提供了新功能并且是比 Readable 更高级别的抽象,但许多或大多数组合关系都是如此。

Facade 既减少了依赖性(耦合)又增加了客户端的抽象。请注意,Facade 模式的图始终显示 多个 来自 Facade 对象的传出箭头。