像包装器一样使用 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 的一个例子,只有当 Foo
和 FooFacade
共享相同的接口时才有意义。
interface Foo { boolean isFunny(p1, p2); }
class FooFacade implements Foo { ... } // FooDecorator, actually
相比之下,the Facade pattern 用于执行更复杂的交互,其中涉及一些不同的 类(并隐藏这种复杂性)。
我通常会使用 Facade 来隐藏内部实现细节,并且 类 被另一个第三方库或某些复杂的子系统使用。如果 IsFunnyInput
-Class 来自另一个库或一个子模块,则外观将帮助您轻松切换库或更改一些实现细节,因为它被外观包裹并且您的所有代码都将使用外观.
如果您只是想将自己编写的 类 如此简单地包装到外观中而不涉及额外的 类,我看不出有任何实际好处!
Here is a really good explanation of the Facade Design pattern
我经常看到一些人这样使用门面。
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 的一个例子,只有当 Foo
和 FooFacade
共享相同的接口时才有意义。
interface Foo { boolean isFunny(p1, p2); }
class FooFacade implements Foo { ... } // FooDecorator, actually
相比之下,the Facade pattern 用于执行更复杂的交互,其中涉及一些不同的 类(并隐藏这种复杂性)。
我通常会使用 Facade 来隐藏内部实现细节,并且 类 被另一个第三方库或某些复杂的子系统使用。如果 IsFunnyInput
-Class 来自另一个库或一个子模块,则外观将帮助您轻松切换库或更改一些实现细节,因为它被外观包裹并且您的所有代码都将使用外观.
如果您只是想将自己编写的 类 如此简单地包装到外观中而不涉及额外的 类,我看不出有任何实际好处!
Here is a really good explanation of the Facade Design pattern