【问题标题】:Is "Facade design pattern" and Java interface conceptually same?“外观设计模式”和 Java 接口在概念上是否相同?
【发布时间】:2017-07-09 15:02:51
【问题描述】:

“外观设计模式”和 Java 接口在概念上是否相同?因为两者都通过提供表达复杂功能的简单方式来实现抽象。 我们可以通过创建界面说我们遵循 Facade 模式吗?

【问题讨论】:

    标签: java design-patterns interface facade


    【解决方案1】:

    不,我不一样。 对于实现 外观设计 模式,不需要实现任何接口。它只是提供了一个新层来与您的服务进行通信,例如示例

    class ServiceFacade() {
        private Service1 service1;
        private Service2 service2;
    
       public void update(Entity entity){
          service1.update(entity);
          service2.update(entity);
       }
    }
    

    所以它会给你一个点来与所有相关的服务进行通信。无需调用service1.update()service2.update(),您只需调用facade.update(),因此您可以确定这两个服务都会更新实体。

    再举一个例子:也许service 一直在更新,你需要缓存到refresh()。这也可以封装在您的 Facade 中:

    public void update(Entity entity) {
        service.update(entity);
        cache.refresh();
    }
    

    如果你的外观类只有一个依赖,但你想扩展这个依赖的功能,你可以通过实现装饰器模式来实现。这是您需要实现接口的地方。 让我们看一下下面的例子。假设你有一个service,你想用一个简单的缓存来扩展它

    class CachedService implement Service {
        private Service service;
        CachedService(Service service, Cache cache){
           ......
        }
        ......
    
        private Entity get(Long id) {
            Entity cachedEntity = cache.get(id);
            if (cachedEntity != null){
               return cachedEntity;
            }
            return service.get(id);
        }
    }
    

    【讨论】:

    • 谢谢。那么我们可以说界面是使用“外观模式”的一种方式吗?
    • @KaushikLele 如果你的外观类实现了与它包含的服务相同的接口,那就是装饰器模式
    【解决方案2】:

    Façade 是一种概念设计模式。没有特定的接口或实现。

    它只是一个额外的层,您可以在其上实现操作,否则会迫使上层理解并耦合到自己不相关的实现细节。

    例如,façade 方法 可能是信用卡支付流程,您需要在该流程上发送许多请求并处理它们的响应以将计费结果存储在某个数据库中。

    如果没有外观方法,您需要使用信用卡执行付款的系统的每个部分都需要重新重复这 5-10 行代码。在某些时候,您发现在执行这些操作时需要一个额外的步骤,并且您意识到您需要重构数千行代码。也就是说,您的解决方案可能存在安全漏洞,您将无法及时响应安全处理。 外观可以让一个糟糕的软件供应商变成一个严肃而强大的供应商!

    另一方面,当您实现适当的外观时,当某些层需要执行信用卡支付时,它只是注入一个计费外观 它对计费流程是如何进行的保持不可知论,因此您不会在系统的许多部分重复自己,重构也不是一项乏味且耗时的任务。

    虽然外观模式本身并没有定义接口,但外观应该被定义为接口,因为它们也可以充当代理:实现可以利用服务层 直接和其他可能调用 RESTful API 来执行相同的任务,具体取决于 需要外观本身。

    无论如何,这种设计模式并不是专门用于简化给定的服务层。您可能会认为 façade 方法 是一种可以简化涉及许多正则表达式、替换和插入的复杂字符串操作的方法。

    【讨论】:

      【解决方案3】:

      Facade 隐藏了系统的复杂性,并为客户端提供了一个接口,客户端可以通过该接口访问系统,这意味着 Facade 对客户端隐藏了低级功能。

      该接口是否为 java 接口取决于您。

      【讨论】:

        【解决方案4】:

        好问题。我曾经在一次采访中被问到一个接口代表什么设计模式,我最好的猜测是外观。不过,我真的不知道面试官想表达什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-30
          • 1970-01-01
          • 2011-09-28
          • 1970-01-01
          • 2014-11-09
          • 2018-06-14
          • 1970-01-01
          相关资源
          最近更新 更多