立面是指建筑物的外观。 当穿过街道时,我们所看到的只是建筑物的外观。 该图面抽象了建筑物的所有复杂实施细节。
同样, 外观设计模式旨在为子系统中的一组接口提供统一的接口。 这个统一的接口对客户端隐藏了子系统的复杂性。 它属于结构模式类别。
Java中的java.util.Connection是外观,因为它允许我们创建数据库连接并隐藏实现细节。 同样, java.net。 URL类是另一个外观,它公开了隐藏所有涉及细节的openStream()方法。
外观模式通常是重构模式。 对于大型的复杂子系统,使用外观模式并为客户端提供友好的界面进行交互是一个相当不错的主意。
实施外观模式:
让我们首先定义一个接口– BookGenre :
public interface BookGenre { List<Book> getBookList(); }
代表不同书籍类别的所有类都将实现此接口:
public class Fiction implements BookGenre { ... } public class NonFiction implements BookGenre { ... } public class Technology implements BookGenre { ... }
我们可以让客户自己与所有子系统类进行交互,以借用一本书。
但是为了简化起见,让我们创建一个LibraryService作为外观,它将公开以下功能:
public enum BookType { FICTION, NONFICTION, TECHNOLOGY } public class LibraryService { private BookGenre fiction; private BookGenre nonFiction; private BookGenre technology; public LibraryService() { this .fiction = new Fiction(); this .nonFiction = new NonFiction(); this .technology = new Technology(); } public void borrowBook(BookType type, String name) { List<Book> books; switch (type) { case FICTION: books = this .fiction.getBookList(); break ; case NONFICTION: books = this .nonFiction.getBookList(); break ; default : books = this .technology.getBookList(); } Book book = BookService.findBookByName(books, name); book.setAvailability( false ); } ... }
为了使实现简单,我们在此假设每个书名只有一本书。
请注意,我们尚未添加任何其他功能。 方法借书()使用现有的子系统API来执行此操作。
UML图:
我们可以将上面的示例表示为:
有了这个外观,我们的客户就可以直接与其交互,而不必自己处理系统内部细节。
值得注意的要点:
让我们快速回顾一些要点:
- 充当子系统的入口点,并且不向子系统添加更多功能
- 隐藏在门面类后面的子系统的复杂性; 简化了客户端的访问点
- 消除了客户端类自行管理子系统的需要
- 促进客户端和子系统之间的松散耦合
- 外观类绝不限制客户对子系统的直接访问
- 我们可以根据需要为复杂系统创建任意数量的外观。 这样做的目的是使客户端易于访问
- 努力维护额外的代码层并将其与我们的子系统进行的更改同步
结论:
在本教程中,我们探索了另一种称为外观模式的结构设计模式。 这是一种重构模式,主要用于为复杂且设计不良的子系统提供更简单的外观。
翻译自: https://www.javacodegeeks.com/2019/08/facade-design-pattern-java.html