【问题标题】:Using Facade Like a wrapper像包装器一样使用外观
【发布时间】:2023-04-03 02:20:01
【问题描述】:

我经常看到有人这样使用外观。

public class FooFacade {
   Foo foo;

   public boolean isFunny(param1, param2) {
       IsFunnyInput isFunnyInput = new IsFunnyInput(param1, param2);
       return foo.isFunny(isFunnyInput);
   }
}

这是一个正确的方法吗?在我看来,它只是在包中添加了一个类。当你也可以直接使用 Foo 来做同样的事情。

【问题讨论】:

    标签: java design-patterns wrapper anti-patterns facade


    【解决方案1】:

    对我来说,这是the decorator pattern 的一个例子,只有FooFooFacade 共享相同的接口才有意义。

    interface Foo { boolean isFunny(p1, p2); }
    class FooFacade implements Foo { ... } // FooDecorator, actually
    

    相比之下,the Facade pattern 用于执行涉及几个不同类的更复杂的交互(并隐藏这种复杂性)。

    The Wrapper pattern (aka Adapter) 表示多个接口。

    【讨论】:

    • 不同意。装饰器在添加功能的同时维护界面。 OP 的示例简化了界面。外观听起来正确。
    【解决方案2】:

    我通常会使用 Facade 来隐藏内部实现细节和其他第三方库或某些复杂子系统使用的类。如果IsFunnyInput-Class 来自另一个库或一个子模块,则外观将帮助您轻松切换库或更改一些实现细节,因为它被外观包装并且您的所有代码都将使用外观。 如果您只是要将自己编写的简单类包装到外观中而不涉及额外的类,我看不到任何真正的好处!

    Here is a really good explanation of the Facade Design pattern

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 2016-02-12
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多