门面模式/Facade

意图/适用场景:

设计师处理很杂系统 的一个常见方法是“分而治之”,把一个系统划分为几个较小的子系统,每个子系统提供一种单一的服务。这样做之后,可能会出现大量的子系统,客户端往往要同时与很多子系统打交道之后才能达到目的。

门面模式创造出一个门面对象,将客户端所涉及的具体子系统数目减至最小,使用客户端与众多了系统的相互作用被门面对象所取代。显然,门面模式是实现代码重构以便达到迪米特法则要求的一个强大有力的武器。

一个典型的例子是中国的医院。这个职能部门就相当于各个子系统,比如挂号、门诊、化验、收费、取药等等。看病的人要与所有这些部门打交道。如果有一个接待员(相当于门面)负责代为挂号缴费、取药的话,病人就可以从繁琐的流程是解放出来。

UML:

参与者:

  1. 服务者(server):为客户端提供服务。系统中存在众多的服务者,每一个服务者为客户提供某一种服务。
  2. 客户(Client):服务的使用者。
  3. 门面(Facade):与各个服务者打资产,处理繁琐的逻辑。为客户提供简单的接口。

要点:

门面模式的要点是在客户端与服务者之间增加一个“集线器”,减轻客户端的负担,把客户端从繁琐的逻辑中解放出来。

“门面”本身并不提供附加的功能,只是承担了处理复杂逻辑的工作,从而为客户端提供更加简单的接口。

示例代码:

[java] // Source code from file:  Facade.java package designPatterns.Facade; public class Facade {
private ServerA serverA = new ServerA(); private ServerB serverB = new ServerB(); private ServerC serverC = new ServerC(); private ServerD serverD = new ServerD(); public void service() {
serverA.service(); serverB.service(); serverC.service(); serverD.service(); } } // Source code from file:  Server.java package designPatterns.Facade; public interface Server {
public void service(); } // Source code from file:  ServerA.java package designPatterns.Facade; public class ServerA implements Server {
public void service() {
System.out.println("Service of ServerA"); } } // Source code from file:  ServerB.java package designPatterns.Facade; public class ServerB implements Server {
public void service() {
System.out.println("Service of ServerB"); } } // Source code from file:  ServerC.java package designPatterns.Facade; public class ServerC implements Server {
public void service() {
System.out.println("Service of ServerC"); } } // Source code from file:  ServerD.java package designPatterns.Facade; public class ServerD implements Server {
public void service() {
System.out.println("Service of ServerD"); } } // Source code from file:  User.java package designPatterns.Facade; public class User {
public static void main(String[] args) {
Facade facade = new Facade(); facade.service(); } } [/java]