📜  外观设计模式 |介绍

📅  最后修改于: 2021-09-10 02:52:35             🧑  作者: Mango

Facade 是 Gang of Four 设计模式的一部分,属于结构设计模式。在我们深入研究它的细节之前,让我们讨论一些将由这个特定模式解决的例子。

所以,顾名思义,它的意思是建筑物的表面。走过马路的人只能看到这座建筑的玻璃面。他们对布线、管道和其他复杂情况一无所知。它隐藏了建筑物的所有复杂性,并显示出友好的面孔。

更多例子

在Java,JDBC 接口可以称为 Facade,因为我们作为用户或客户端使用“Java.sql.Connection”接口创建连接,我们不关心它的实现。实现留给驱动程序的供应商。

另一个很好的例子是计算机的启动。计算机启动时,涉及到cpu、内存、硬盘等工作,为了方便用户使用,我们可以添加一个外观来包装任务的复杂性,并提供一个简单的界面来代替。
Facade Design Pattern 也是如此。它隐藏了系统的复杂性,并为客户提供了一个接口,客户可以从该接口访问系统。

外观设计模式图

现在让我们通过一个简单的例子来尝试更好地理解外观模式。让我们考虑一家酒店。这家酒店有酒店管理员。酒店内有很多餐厅,例如素食餐厅、非素食餐厅和素食/非两者餐厅。
您作为客户想要访问不同餐厅的不同菜单。你不知道他们有什么不同的菜单。您只需联系熟悉酒店的酒店管理员即可。无论您想要哪种菜单,您都可以告诉酒店老板,他会将其从相应的餐厅中取出并交给您。在这里,酒店管理员充当门面,因为他隐藏了系统酒店的复杂性。
让我们看看它是如何工作的:

酒店界面

package structural.facade;
public interface Hotel
{
    public Menus getMenus();
}

酒店界面只返回Menus。
同样的,Restaurant 也是三种类型,可以实现酒店接口。让我们看看其中一间餐厅的代码。

非素食餐厅。Java

package structural.facade;
  
public class NonVegRestaurant implements Hotel
{
    public Menus getMenus()
    {
        NonVegMenu nv = new NonVegMenu();
        return nv;
    }
}

素食餐厅。Java

package structural.facade;
  
public class VegRestaurant implements Hotel
{
    public Menus getMenus()
    {
        VegMenu v = new VegMenu();
        return v;
    }
}

VegNonBoth 餐厅。Java

package structural.facade;
  
public class VegNonBothRestaurant implements Hotel
{
    public Menus getMenus()
    {
        Both b = new Both();
        return b;
    }
}

现在让我们考虑外观,

酒店管理员。Java

package structural.facade;
  
public class HotelKeeper
{
    public VegMenu getVegMenu()
    {
        VegRestaurant v = new VegRestaurant();
        VegMenu vegMenu = (VegMenu)v.getMenus();
        return vegMenu;
    }
      
    public NonVegMenu getNonVegMenu()
    {
        NonVegRestaurant v = new NonVegRestaurant();
        NonVegMenu NonvegMenu = (NonVegMenu)v.getMenus();
        return NonvegMenu;
    }
      
    public Both getVegNonMenu()
    {
        VegNonBothRestaurant v = new VegNonBothRestaurant();
        Both bothMenu = (Both)v.getMenus();
        return bothMenu;
    }    
}

由此可知,复杂的实现将由 HotelKeeper 自己完成。客户只需访问 HotelKeeper 并询问 Veg、NonVeg 或 VegNon Both Restaurant 菜单。

客户端程序将如何访问这个外观?

package structural.facade;
  
public class Client
{
    public static void main (String[] args)
    {
        HotelKeeper keeper = new HotelKeeper();
          
        VegMenu v = keeper.getVegMenu();
        NonVegMenu nv = keeper.getNonVegMenu();
        Both = keeper.getVegNonMenu();
  
    }
}

通过这种方式,实现被发送到门面。客户端只有一个接口,并且只能访问该接口。这隐藏了所有的复杂性。

什么时候应该使用这种模式?

当您有一个复杂的系统想要以简化的方式向客户端公开时,或者您想要在与系统不兼容的现有系统上创建一个外部通信层时,外观模式是合适的。 Facade 处理接口,而不是实现。它的目的是将内部复杂性隐藏在一个表面上看起来很简单的单一界面后面。