设计模式十一:外观模式(Facade Pattern)

这篇具有很好参考价值的文章主要介绍了设计模式十一:外观模式(Facade Pattern)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中,简化了客户端与子系统之间的交互,使得客户端代码更加清晰、简洁。

外观模式的使用场景包括:

  1. 简化复杂子系统的调用:当一个系统中存在多个复杂的子系统时,可以使用外观模式将这些子系统封装起来,提供一个简单的接口给客户端使用。这样客户端就不需要直接与复杂子系统进行交互,从而简化了调用过程。
  2. 隔离变化:当系统中的子系统发生变化时,如果客户端与子系统直接耦合在一起,可能会导致大量的代码修改。而通过外观模式,只需要调整外观类即可,客户端无需做出任何修改,从而隔离了子系统变化对客户端的影响。
  3. 提供统一的接口:当系统中存在多个较为复杂的接口和协议时,可以使用外观模式将这些接口和协议封装成一个简单的接口,方便客户端进行调用。这样客户端无需关心具体的实现细节,只需要与外观接口进行交互即可。
  4. 构建分层结构系统:当系统需要采用分层结构时,可以使用外观模式建立各个层之间的联系。每个层的外观类作为对外的接口,隐藏了底层的实现细节,提供了一种简化的方式进行系统开发和维护。

外观模式中的主要角色有以下几个:

  1. 外观(Facade):外观角色是外部客户端访问复杂子系统的入口点。它封装了底层子系统的复杂性,提供了一个简单的接口供客户端使用。外观角色知道应该如何将客户端的请求委派给适当的子系统对象来进行处理。
  2. 子系统(Subsystem):子系统角色包含一组相关的类或接口,实现了子系统的具体功能。每个子系统都负责处理来自外观的请求,并根据需要执行相应的操作。外观将这些请求委派给合适的子系统对象来完成实际的工作。
  3. 客户端(Client):客户端角色通过调用外观角色提供的简化接口来间接地访问子系统的功能。客户端并不直接与子系统交互,而是通过外观角色来完成需要的操作。
    外观角色起到了协调和封装的作用,隐藏了子系统的复杂性,使得客户端可以更方便地使用子系统的功能。同时,子系统角色通过提供具体的实现来满足外观角色的请求。客户端角色则通过与外观角色进行交互间接地使用子系统的功能。

java代码举例

以外卖送货为例,根据业务分别将制作食物,运输方式,顾客信息拆分成三个服务,做一个外观模式,这三个服务集合在一起暴露一个对外接口
子系统:

/**
 * 制作Coffee
 */
public class Coffee {
    public String getCoffee(String coffeeType) {
        return "1.The " + coffeeType + " is ready ;";
    }
}

/**
 * 顾客信息
 */
public class Customer {
    public String getCustomerInfo(String customerName) {
        return "3:Deliver to " + customerName + ";";
    }
}

/**
 * 运输方式
 */
public class Transport {
    public String getTransport(String transportType) {
        return "2.Choose " + transportType + ";";
    }
}

外观:

/**
 * 外观类
 * 集成制作Coffee,选择对应的运输方式,并送达到指定顾客手中
 */
public class CoffeeFacade {

    private Coffee coffee;
    private Transport transport;
    private Customer customer;

    public CoffeeFacade() {
        this.coffee = new Coffee();
        this.transport = new Transport();
        this.customer = new Customer();
    }

    public String getCoffee(String coffeeType, String transportType, String customerName) {
        StringBuilder sb = new StringBuilder();
        sb.append(coffee.getCoffee(coffeeType));
        sb.append(transport.getTransport(transportType));
        sb.append(customer.getCustomerInfo(customerName));
        return sb.toString();
    }

客户端:

/**
 * 模拟客户端
 */
public class Facade {

    public static void main(String[] args) {
        CoffeeFacade facade = new CoffeeFacade();
        String starbucks = facade.getCoffee("Starbucks", "take-out", "li-hong-wang");
        System.out.println(starbucks);
    }
}

运行结果

1.The Starbucks is ready ;
2.Choose take-out;
3:Deliver to li-hong-wang;

外观模式的优缺点

优点:

  1. 简化接口:外观模式通过封装复杂子系统的接口,提供了一个简化且统一的接口给客户端使用。这样可以降低客户端与子系统之间的耦合度,并且减少了客户端需要了解的知识。
  2. 隐藏实现细节:外观模式将复杂子系统的实现细节隐藏在后面,使得客户端不需要关心复杂的内部操作过程,只需通过外观对象进行简单的调用即可。
  3. 提高灵活性:通过外观模式,可以随时更改或扩展复杂子系统的实现,而不会影响到客户端代码。对于客户端来说,只要外观接口不发生变化,就不需要做任何修改。
  4. 降低依赖性:外观模式将客户端与子系统解耦,减少了客户端直接依赖于多个子系统的情况。这样可以减少代码的耦合度,并提高代码的可维护性和可测试性。

缺点:文章来源地址https://www.toymoban.com/news/detail-636839.html

  1. 过度增加外观类:如果系统中的子系统非常复杂,可能会导致外观类变得庞大而复杂。这样就会破坏了外观模式的简化和封装的初衷。
  2. 不符合开闭原则:当需要新增或修改子系统时,可能需要修改外观类的代码。这可能会导致外观类的频繁修改,违反了开闭原则。

到了这里,关于设计模式十一:外观模式(Facade Pattern)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java外观设计模式

    外观模式(Facade Pattern)是一种结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。这种模式属于结构型模式,它向现有的系统添加一个接口,来隐

    2024年02月16日
    浏览(27)
  • 【Java 设计模式】结构型之外观模式

    外观模式(Facade Pattern)是一种结构型设计模式, 它为复杂系统提供了一个简化的接口,隐藏了系统的复杂性,使得客户端更容易使用系统 。外观模式通过创建一个包装类(外观类),将系统的复杂性封装起来,对客户端提供一个简单的接口。在本文中,我们将深入研究Ja

    2024年01月21日
    浏览(36)
  • 设计模式-外观模式在Java中的使用示例

    外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统 之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。 示例 自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自

    2024年02月17日
    浏览(37)
  • Java设计模式—组合模式(Composite Pattern)

            组合模式(Composite),将对象组合成树形结构以表示\\\'部分-整体\\\'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 MenuComponent  抽象类:定义了菜单组件的基本行为,包括打印名称和管理子元素的方法。 Menu  类:表示菜单,可以包含其他

    2024年04月15日
    浏览(38)
  • Java设计模式之建造者模式详解(Builder Pattern)

    在日常的开发工作中,我们常常需要创建一些复杂的对象。这些对象可能包含许多不同的属性,并且这些属性的初始化过程可能相当复杂。在这种情况下,建造者模式是一种非常有用的设计模式,因为它允许我们分步骤地创建复杂的对象。 概念和原理: 建造者模式(Builder

    2024年02月09日
    浏览(35)
  • Java设计模式之过滤器模式(Filter Pattern)

    过滤器模式(Filter Pattern)是一种常用的设计模式,它用于通过一系列条件来过滤对象集合,并将满足条件的对象保留下来。该模式可以帮助我们在不修改原始对象集合的情况下,根据特定的条件对集合进行筛选和处理。 在过滤器模式中,通常有三个核心角色: 过滤器接口(

    2024年02月07日
    浏览(34)
  • 《golang设计模式》第二部分·结构型模式-05-门面模式Facade)

    门面(Facade)向客户端提供使用子系统的统一接口,用于简化客户端使用子系统的操作。 门面角色(Facade) 客户端可以调用的接口或方法 此角色知晓系统的所有功能和责任 一般情况下,该角色没有实际业务逻辑,只是一个委托类。 子系统角色(Subsystem) 同时有一个或多个

    2024年02月07日
    浏览(48)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(42)
  • 设计模式系列-外观模式

    一、上篇回顾 上篇我们主要讲述了创建型模式中的最后一个模式-原型模式,我们主要讲述了原型模式的几类实现方案,和原型模式的应用的场景和特点,原型模式 适合在哪些场景下使用呢?我们先来回顾一下我们上篇讲述的3个常用的场景。 1、我们在运行态的时候,动态的

    2024年02月09日
    浏览(28)
  • 设计模式详解-外观模式

    类型:结构型模式 实现原理:定义了一个高层接口,向现有的系统中的一组接口提供一致的界面 目的:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口,使系统更加容易使用 何时使用:简化复杂系统,方便操作 解决方法:对客户端和系统解耦,让外观类

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包