门面设计模式

2021-10-26 From 程序之心 By 丁仪

今天,我们将深入研究属于结构模式的门面模式。顾名思义,它是架构的门面。门面是一个对象,它充当客户端访问系统的前端接口,但掩盖了系统和代码结构的复杂性。

如下图所示,门面类在子系统和子系统的用户之间,使得对所有子系统的访问通过门面类进行。多个客户端现在可以获取不同子系统的信息,而不会暴露子系统的复杂性。


实现门面模式

假设你是一个泡泡茶爱好者。一家泡泡茶店有 2 个分店,每个分店出售不同的饮料。作为客户,您想知道不同分店销售的饮料,但您只能访问BubbleTeaManager类,该类知道每个分店销售的所有饮料。如果您想知道某个分店出售的饮料,只需告诉BubbleTeaManager,他就会显示该分店出售的所有饮料。

public interface BubbleTea {
    public Drinks getDrinks();
}
public class OrchardBranch implements BubbleTea {
   public Drinks getDrinks() { 
      OrchardBranchDrinks drinks = new OrchardBranchDrinks();
      return drinks;
   }
}
public class SomersetBranch implements BubbleTea {
   public Drinks getDrinks() {
      SomersetBranchDrinks drinks = new SomersetBranchDrinks();
      return drinks;
   }
}

从上面的代码中,我们有BubbleTea接口,它有一个返回已售饮料的方法。接下来,OrchardBranch类和SomersetBranch类是实现BubbleTea接口的 2 个不同的 Bubble Tea 分支。接下来,让我们实现今天的主要角色,即充当 Facade的BubbleTeaManager类, 如下所示:

public class BubbleTeaManager {
   public OrchardBranchDrinks getOrchardBranchDrinks() {
      OrchardBranch ob = new OrchardBranch();
      OrchardBranchDrinks drinks =      (OrchardBranchDrinks)ob.getDrinks();
      return drinks;
   }
   public SomersetBranchDrinks getSomersetBranchDrinks() {
      SomersetBranch sb = new SomersetBranch();
      SomersetBranchDrinks drinks = (SomersetBranchDrinks)sb.getDrinks();
      return drinks;
   }
}

这里我们有BubbleTeaManager,它充当 Facade,它知道不同分店出售的每一种饮料。复杂的实现将由BubbleTeaManager类本身完成,客户端可以通过查询不同 Bubble Tea 分店出售的饮料来直接访问它。客户端现在可以检索不同的饮料,如下所示:

public class Client {
   public static void main (String[] args) {
      BubbleTeaManager btm = new BubbleTeaManager();
      OrchardBranchDrinks obd = btm.getOrchardBranchDrinks()
      SomersetBranchDrinks sbd = btm.getSomersetBranchDrinks();
   }
}

使用给定的BubbleTeaManager 类,客户端只需访问接口即可检索不同分支机构销售的所有饮料,而无需了解代码的所有复杂细节。因此,这就是 Facade 类如何封装所有功能并将其隐藏在其余代码中的方式。它知道将客户的请求指向何处以及如何操作所有活动部件。

这是 Facade 模式实现的类图。如上所示,当客户端请求BubbleTeaManager门面执行某些操作时,它不会暴露子系统(OrchardBranch和SomersetBranch类,BubbleTea接口)的代码和结构。Facade 类然后帮助将客户端的请求委托给以下子系统。

结论

门面模式对于向组件的客户端隐藏组件的内部结构很有用。您还可以在与使用门面模式的系统不兼容的现有系统上创建外部通信层。另外,它还降低了客户端和子系统之间的耦合,因为我们现在能够将代码与子系统的复杂性隔离开来。

本文来源:程序之心,转载请注明出处!

君子曰:学不可以已。
《软件需求(第3版)》

作为经典的软件需求工程畅销书,经由需求社区两大知名领袖结对全面修订和更新,覆盖新的主题、实例和指南,全方位讨论软件项目所涉及的所有需求开发和管理活动,介绍当下的所有实践。书中描述实用性强的、高效的、经过实际检验的端到端需求工程管理技术,通过丰富的实例来演示如何利用实践来减少订单变更,提高客户满意度,减少开发成本。

发表感想

© 2016 - 2024 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号