像包装器一样使用 Facade

Using Facade Like a wrapper

我经常看到一些人这样使用门面。

public class FooFacade {
   Foo foo;

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

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

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

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

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

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

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

Here is a really good explanation of the Facade Design pattern