1.定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。
门面模式提供一个高层次的接口,使得子系统更易于使用。
门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。
门面对象是外界访问子系统内部的唯一通道,不管子系统内部是多么杂乱无章,只要有门面在,就可以做到“金玉其外败絮其中”。
2.门面模式的使用场景
- 为一个复杂的模块或子系统提供一个工外界访问的接口
- 子系统相对独立-外界对子系统的访问只要黑箱操作就行了
- 预防低水平人员带来的风险扩散
门面模式很简单,无非就是对外只提供一个门面暴露外界需要的API,请看下面的通用代码
package _17FacadePattern;
/**
* 子系统中的A业务
*/
public class ClassA {
public void doSomethingA() {
}
}
package _17FacadePattern;
/**
* 子系统中的B业务
*/
public class ClassB {
public void doSomethingB() {
}
}
package _17FacadePattern;
/**
* 子系统中的门面1,只暴露外界需要的API
*/
public class Facade {
private ClassA classA = new ClassA();
private ClassB classB = new ClassB();
// 对外暴露的API
public void methodA()
{
classA.doSomethingA();
}
public void methodB()
{
classB.doSomethingB();
}
}
3.门面模式的两个角色
- Facade门面角色:客户端可以调用这个角色的方法。此角色知道子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去,也就是说该角色没有实际的业务逻辑,只是一个委托类。
- subsystem子系统角色:可以同时有一个或多个子系统。每个子系统都不是一个单独的类,而是一个类的集合。子系统不知道门面的存在,对子系统来说门面仅仅是另一个客户端而已。
4.门面模式的优点
- 减少系统的相互依赖:外界只对门面的API产生依赖,而对子系统内部完全解耦。
- 提高了灵活性:依赖减少了,灵活性自然提高了。不管子系统内部如何变化,只要不影响门面对象,任你自由活动。
- 提高安全性:想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问。
5.门面模式的缺点
门面模式的最大缺点就是不符合开闭原则,对修改关闭,对扩展开放,看看我们的门面对象,它可是重中之重,一旦系统投产后发现有一个小错误,怎么解决?完全遵照开闭原则根本无法解决。继承和覆盖都顶不上用。唯一能做的就是修改门面角色的代码,这个风险很大。
6.门面模式的注意事项
6.1什么时候一个子系统需要多个门面
- 门面已经庞大到不能忍受的程度:当一个类的代码有好几千行的时候,我觉得你很好理解。
- 子系统可以提供不同的访问路径:上面的通用代码中Facade类对外暴露了ClassA、ClassB、ClassC的所有API,但是这些API我可能只想暴露给X客户端,至于给Y客户端我只想暴露ClassB的API,怎么实现?请看下面代码:
package _17FacadePattern;
/**
* 子系统中的门面2,对外暴露ClassB的API
*/
public class Facade2 {
private Facade facade = new Facade();
// 对外暴露ClassB的API
public void methodB()
{
facade.methodB();
}
}
增加的门面很简单,委托给了已经存在的门面对象Facade进行处理,为什么要是有委托而不再编写一个委托到子系统的方法呢?那是因为在面向对象编程中,尽量保持相同的代码只写一遍,避免以后到处修改相似代码的悲剧。
6.2门面不参与子系统的内的业务逻辑
这是什么意思呢,请看下面代码:
package _17FacadePattern;
/**
* 子系统中的门面3,门面中包含了业务
*/
public class Facade3 {
private ClassA classA = new ClassA();
private ClassB classB = new ClassB();
// 对外暴露的API
public void methodA()
{
classA.doSomethingA();
}
public void methodB()
{
classA.doSomethingA();
classB.doSomethingB();
}
}
因为某个需求更改,我们在门面的methodC里面调用了另一个方法。其实这样的设计是非常不靠谱的,为什么呢?因为你已经让门面对象参与了业务逻辑,门面对象只是提供一个访问子系统的路径而已,它不应该也不能参与具体的业务逻辑,否则就会产生一个倒依赖的问题,子系统必须依赖门面才能被访问,这是设计上的一个严重错误,不仅违背了单一职责原则,同时也破坏了系统的封装性。
好吧,说了这么多,让我们看看应该怎么改:
先将methodC的逻辑封装到另一个类中
package _17FacadePattern;
/**
* 业务的封装类
*/
public class Context {
private ClassA classA = new ClassA();
private ClassB classB = new ClassB();
// 对外暴露的API
public void methodB()
{
classA.doSomethingA();
classB.doSomethingB();
}
}
然后门面中调用封装类:
package _17FacadePattern;
/**
* 子系统中的门面4,将3中包含的业务逻辑封装到一个业务类中
*/
public class Facade4 {
private ClassA classA = new ClassA();
private Context context = new Context();
// 对外暴露的API
public void methodA()
{
classA.doSomethingA();
}
public void methodB()
{
context.methodB();
}
}
通过这样一次封装后,门面对象又不参与业务了,在门面模式中,门面角色应该是稳定的,它不应该经常变化,一个系统一旦投入运行,它就不应该被改变,它是一个系统对外的接口,你经常变化怎么保证其他模块的稳定运行呢?但是,业务逻辑是经常改变的,我们已经把它封装在子系统内部,无论你如何变化,对外界的访问者来说,都还是同一个门面,同样的方法-这才是架构师最希望看到的结构。
分享到:
相关推荐
门面模式(Facade Pattern)是软件工程中一种常用的结构型设计模式,它的主要目的是提供一个统一的接口,用来简化系统中一组复杂的接口或类的使用。这个模式将复杂的子系统接口封装在一个简单的门面对象中,使得...
门面模式(Facade Pattern)是软件工程中一种常用的设计模式,它为子系统提供了一个统一的接口,使得客户端可以更加简单地使用子系统的功能,而无需了解子系统内部的复杂性。在Java编程中,门面模式是面向对象设计的...
### C++设计模式之门面模式(Facade Pattern) #### 一、门面模式概述 在软件工程领域,设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易...
7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式...
21. 门面模式(Facade Pattern):为子系统提供一个一致的接口,使得这些子系统更容易使用。 22. 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象,减少内存消耗。 23. 外观模式(Facade ...
6. 门面模式(Facade Pattern): 门面模式是提供一个统一的接口来访问一个子系统的多个接口。它的主要作用是简化子系统的使用,提高代码的可读性和维护性。 7.享元模式(Flyweight Pattern): 享元模式是用来优化...
23. 门面模式(Facade Pattern):为子系统提供一个统一的接口,使得这些子系统更加容易被使用。 以上23种模式在C#编程中都有广泛的应用,通过实例学习能够帮助开发者更好地理解它们的原理和应用场景,提高代码质量...
5. 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的界面。 6. 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。 7. 门面模式(Front Controller Pattern):提供一个统一...
7. 门面模式(Facade Pattern):为子系统中的一组接口提供一个统一的界面。 8. 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 9. 桥接模式(Bridge...
10. 门面模式(Facade Pattern) 门面模式是一种结构模式,提供了一种对外提供统一的接口的方式,使得客户端可以简单地访问对象。门面模式的优点是可以实现对象的简化和抽象,提高了代码的可读性和可维护性。 11. ...
门面模式(Facade Pattern)是一种设计模式,它在软件工程中扮演着简化复杂系统接口的角色。当一个系统或子系统包含大量类,并且客户端需要与这些类进行交互时,门面模式可以提供一个高层次的单一接口,使得客户端的...
7. 门面模式(Facade Pattern) 门面模式提供了一个统一的接口,用来访问子系统中的一群接口。门面定义了一个高层接口,让子系统更容易使用。 8. 适配器模式(Adapter Pattern) 适配器模式允许将一个类的接口...
门面模式(Facade Pattern)是一种结构型设计模式,它的主要目的是为复杂的子系统提供一个统一且简单的接口,使得客户端能够更方便地与这些子系统交互,而无需了解子系统的内部实现细节。这种模式降低了客户端与子...
门面模式(Facade Pattern)是软件工程中一种常用的设计模式,属于结构型模式。它提供了一个统一的接口,用来访问子系统中的一群接口。门面模式使得子系统的使用更为简单,同时也隐藏了子系统的复杂性,使得客户端...
门面模式(Facade Pattern)是软件工程中一种常用的设计模式,属于结构型模式。它为一个复杂的子系统提供了一个统一的接口,使得客户端可以更容易地使用这个子系统,而无需了解其内部的具体实现细节。在实际开发中,...
10. 外观模式或门面模式(Facade Pattern): 外观模式为子系统提供了一个统一的接口,简化了客户端与子系统之间的交互。它隐藏了子系统的复杂性,提供了一个更高层次的接口。 除了以上这些模式,还有其他的设计...
外观模式(Facade Pattern)是设计模式中的一种结构型模式,其主要目的是为了简化客户端与复杂系统之间的交互。在C#编程中,外观模式通常用于减少客户端对子系统组件的依赖,提供一个统一的、高层次的接口,使得...
7. 门面模式(Facade Pattern):为子系统中的一组接口提供一个统一的高层接口,使子系统更容易使用。 8. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口。适配器让原本接口不兼容的...